2

現在、PyGame を使用して複数ファイルの Python (2.6.5) ゲームを作成しようとしています。問題は、ファイルの 1 つ「pyconsole.py」が、プライマリ ファイル「main.py」によってインポートされた他のオブジェクトのインスタンスでメソッドを呼び出せる必要があることです。問題は、すべてのゲーム オブジェクト (プレイヤーの船、敵の船、ステーションなど) のインスタンスを保持するためのリストがメイン ファイルにあることですが、そのリストからメソッドを呼び出すことができないようです。from pyconsole import *メインループが開始する前に「main.py」で実行しているにもかかわらず、 「pyconsole.py」。これは単に不可能であり、代わりに M4 を使用してすべてのファイルを 1 つのファイルに結合し、それをバイトコードでコンパイルしてテスト/配布する必要がありますか?

例:

bash$ cat test.py
#!/usr/bin/python

import math, distancefrom00
foo = 5

class BarClass:
    def __init__(self):
        self.baz = 10
    def get(self):
        print "The BAZ is ", self.baz
    def switch(self)
        self.baz = 15
        self.get()

bar = BarClass()

def main():
    bar.switch()
    print distancefrom00.calculate([2, 4])

if __name__ == '__main__': main()

bash$ cat distancefrom00.py
#!/usr/bin/python

import math
import test

def calculate(otherpoint):
    return str(math.hypot(otherpoint[0], otherpoint[1]))+" (foo = "+str(test.foo)+"; "+test.bar.get()+")"

bash$ python test.py
The BAZ is  15
The BAZ is  10
Traceback (most recent call last):
  File "test.py", line 24, in <module>
    if __name__ == '__main__': main()
  File "test.py", line 22, in main
    print distancefrom00.calculate([2, 4])
  File "/home/archie/Development/Python/Import Test/distancefrom00.py", line 8, in calculate
    return str(math.hypot(otherpoint[0], otherpoint[1]))+" (foo = "+str(test.foo)+"; "+test.bar.get()+")"
TypeError: cannot concatenate 'str' and 'NoneType' objects

ここで、Python の名前、クラス、およびそのすべてについてのある程度限定された理解が正しい場合、NoneType は、その名前test.bar.get()、つまり、test.bar何にも割り当てられていないことを意味します。

4

4 に答える 4

2

問題は、ファイルの 1 つ「pyconsole.py」が、プライマリ ファイル「main.py」によってインポートされた他のオブジェクトのインスタンスでメソッドを呼び出せる必要があることです。

これは、依存関係が間違っているように思えます。通常、メイン ファイルまで「逆方向」に呼び出すものは何もないはずです。その main.py は、他のすべてをまとめる接着剤である必要があり、それに依存するものは何もありません。技術的には、依存関係は有向非巡回グラフを形成する必要があります。ディペンデンシー グラフで循環を見つけたら、共通の側面を新しいファイルに移動して循環を断ち切ります。

そのため、「pyconsole.py」によって使用される「main.py」内のものを新しいファイルに移動します。次に、「main.py」と「pyconsole.py」でその新しいファイルをインポートします。

于 2010-07-26T13:41:50.173 に答える
1

他の回答に加えて、 test.py をスクリプトとして実行すると module であることに注意してください__main__test.pyそこからインポートするdistancefrom00.pyと、新しいtestモジュールが作成されます。barメインスクリプトとtest.barアクセス可能なものdistancefrom00.pyはまったく関係ありません。それらは同じクラスではありません。一方はインスタンス__main__.BarClassであり、もう一方はtest.BarClassインスタンスです。

そのため、15 の後に 10 が続く 2 つの出力が得られます。メイン スクリプトでbarswitchメソッドが呼び出されていますが、テスト モジュールbarは切り替えられていません。

循環インポートは別として、メイン スクリプトを別のモジュールにインポートすることには、独自のレベルの悪さがあります。

于 2010-07-26T14:31:28.653 に答える
0

でオブジェクトをインスタンス化していますpyconsolemain.py? PyConsoleで呼び出されたクラスがある場合はpyconsole、その__init__メソッドにゲーム オブジェクトのリストを取得するパラメーターを指定します。そうpyConsoleすれば、オブジェクトはオブジェクトへの参照を持ちます。

お役に立てれば。Python がインポートされたモジュールを操作する方法を誤解しているようです。

于 2010-07-26T13:40:55.510 に答える
0

サブミットされたコードの問題は、メソッドの本体に print ステートメントしか含まれていないため、クラスのgetメソッドがBarClassの値を返すことです。Noneしたがって、distancefrom00.py関数の結果はcalculate次のようになります。

str + str + str + str + None + str

従ってTypeError: cannot concatenate a 'str' and 'NoneType' objects

への呼び出しから文字列を返すことで、この問題を解決できますget。例えば、

def get(self):
    return "The BAZ is %s" % self.baz

また、2 つのファイルに循環インポートがあることに注意してください。test.pyインポートdistancefrom00.py、およびdistancefrom00.pyインポートtest.py。Kylotan が言うように、循環依存は良くない

于 2010-07-26T14:16:07.693 に答える