2012-05-08 2 views
5

私は最近、自分のコードを別々のファイルに保存しなければならないと言われました。 main.py,engine.py,settings.pyなどとなる。これには確かに管理、スケーラビリティなどの利点がありますが、私には欠点が多すぎるようです。私のPythonコードを複数のクラスに編成するには?

たとえば、画面に表示されるサイズのようなものがあるsettings.pyというスクリプトがあるとしますオブジェクト、シミュレーションの速度、さまざまなオブジェクトの色が定義されている場合、engine.pyスクリプトとmain.pyスクリプトの両方でこれらの変数が必要な場合はどうすればよいですか?両方のスクリプトで2回インポートしますか?むしろ面倒なようです。 engine.pyスクリプトにあるクラスの中にmain.pyのコードが必要な場合はどうなりますか?

ように、それを初期化し、

マイmain.pyスクリプトは、それ自体でpygameのをインポート...私はあなたに正確な状況をお見せしましょう、と。これは画面上のオブジェクトを表すクラスを持っていましたが、そのクラスにはPygame描画関数と呼ばれるメソッドdrawがありました。さて、私のクラスengine.pyの中にクラスを入れると、Pygameがそこに存在しないので、物事はもう機能しません!私はsettings.pyとPygameの両方をengine.pyにインポートしてから、エンジンをmain.pyにインポートしましたが、それはエンジンよりもイニシャライザの方がいいです...一般的なガイドラインのようなものに対処する方法はありますか?

+1

あなたがコードを分割したモジュールをインポートすることを回避しようとしているようです。これが当てはまる場合は、必要な場所にインポートするだけです。 – inspectorG4dget

+10

あなたのコードを複数のファイルに分割していると感じることは、あなたが戻って数カ月で見たことのない5000行のファイルを維持しなければならない時に比較して淡色になります! –

答えて

3

輸入のための公式PEPの注意事項は次のとおりです。http://www.python.org/dev/peps/pep-0008/#imports

また、このStackOverflowの質問を参照してください。What are good rules of thumb for Python imports?

あなたは問題なく、複数のクラスから変数をインポートすることができますが、あなたを試してみて、構築すべきです物事が循環的に輸入されないようにします。 Circular import dependency in Python

1

あなたはこのモデルを見てください。それは物事を理解するのに役立ちます。 、輸入は思えべきではなく、論理的かつ必要に応じてこの場合 http://www.wkoorts.com/wkblog/2007/12/23/mvc-design-patterns-with-python-links/

: 私は、これは実際にあなたが

Model-View-Controller

ここではいくつかのより多くのドキュメントをやりたいと最高に合う一つだと思い。 そして、あなたの3つのファイルでおおまかなことを追加します。ここで

+0

MVCはこの質問に何が関係していますか? – rantanplan

+0

説明から、彼がMVC(データ、コア機能、フロントエンド)を記述していることは論理的です。 – jlengrand

+0

それでも 'data'、' core'、 'frontend'は数十の異なるファイルに分解されるかもしれません/それぞれのモジュール。だから彼の質問はまだ適用されます。それは無関係なものだと思うけど、私はあなたを改造するつもりはない。 – rantanplan

1

ない答え、しかし:

settings.pyが本当にsettings.iniであるべきであり、あなたがConfigParserを使用して、それをお読みください。構成ファイルを一度読んで、その結果のモジュール間でConfigParser.RawConfigParserを共有してください。

+0

しかし、なぜですか?ちょっと面倒なようです。私は 'name = value'のようなクリーンな' .py'ファイルを持つことができます。これらのセクションとすべてのものとは対照的です...また、configを読み込むスクリプトが必要です。そして、どこにでもインポートする必要がありますそれ以外は?実際に私が今行っていることではありませんが、私はこれらの値を直接別のファイルなどから読み込まずに直接設定していますか?答えてください、私は知りたいです! – corazza

+0

それだけでなく、私がタプルを保存したい場合、それは文字列になります! – corazza

1

他の言語(特にJavaの場合、実際にはコンパイラによって強制される)では、クラスごとに1つのファイルを持つことが一般的です。

あなたが言及しているファイル間の依存関係については、グローバル変数を避けることを検討する必要があります。

あなたの質問によく答えられる別の関連する質問があります。

How many Python classes should I put in one file?

0

あなたは彼らが必要とされているすべてのモジュールにsettings.pyからシンボルをインポートすることができます。それがコンセプトです。実際の問題は、輸入が循環している場合です。例えばmain.pyに必要なシンボルがengine.pyにあり、その逆の場合はどうなりますか?この状況では、一般的なパターンは、main.pyengine.pyが問題なくインポートできる第3のモジュールでこれらの依存関係を壊すことです。

1

モジュールを複数の他のモジュールにインポートするのは面倒ではありません。多くのクリーナーであるは、何千ものコード行を持つモジュールよりも優れています。

の輸入に問題があることは事実です。しかし、あなたの状況は循環輸入の問題があるようには聞こえません。 「今、私のengine.pyスクリプトの中にクラスを置くと、Pygameがそこに存在しないので、何も機能しなくなりました!私は、settings.pyとPygameの両方をengine.pyにインポートして、インポートしましたエンジンをmain.pyに追加します。

なぜクラスをengine.pyに入れてmain.pyにインポートできないのですか?これを行う1つの非常に簡単な方法は、あなたのクラスにコールバックを渡すために、次のようになります。自身の状態:このアプローチについての素晴らしい何

# engine.py 
... 
class ClassWithDraw(Subclass): 
    def __init__(self, draw_callback): 
     ... 
     self._draw_func = draw_callback 
     ... 
    def draw(self): 
     self._draw_func() 

# main.py 

from engine import ClassWithDraw 
drawer = ClassWithDraw(drawfunc) 

は、オブジェクトが本当に一つのことに対してのみ責任があるということです。実際には、このオブジェクトがdrawメソッドをまったく持たない方が理にかなっているかもしれません。必要であればいつでも描画可能データを取得するために呼び出されるdraw_hookを持つことができ、別の外部描画関数が呼び出すことができます。

さらに別のアプローチは、Pygameのための完全に別のモジュールを持つことです。私はPygameについてよく知らないので、これはうまくいかないかもしれませんが、Pygameの初期化と状態を扱うモジュールがあるとします。 mainで一度だけ初期化し、必要に応じてインポートすることができます。

関連する問題