2017-08-10 6 views
0

オブジェクトのインスタンスをファイルの先頭またはクラスのメソッド内にインスタンス化することをお勧めしますか?たとえば:ファイルの開始時またはメソッド内でのPythonオブジェクトのインスタンス化?

# start of file 
foo = Foo() 
class Bar(object): 
    def bar(self): 
     foo.some_method() 

または

# start of file 
class Bar(object): 
    def bar(self): 
     foo = Foo() 
     foo.some_method() 

は、任意のパフォーマンスの違いにもありますか?これはFooにメソッドが呼び出されるたびに作成

class Bar(object): 
    def bar(self): 
     foo = Foo() 
     foo.some_method() 

+0

例に誤りがあり、2番目の例で 'def bar(self)'と 'self.foo = Foo()'、 'self.foo.some_method()'にする必要があります。それはあなたが意味することですか? – rth

+0

訂正していただきありがとうございます。私はdef bar(self)を編集しました。インスタンス化されたオブジェクトを保存することを意味するものではありません。私が述べた2つのオプションよりも良い方法があるかどうかは自由に感じてください。 – jamesalone

+0

ええ、これら2つの例は同じではありません!最初のものでは、誰かがFooクラスの別のメソッドを呼び出してその状態を変更できます。しかし、2番目の例では、fooオブジェクトはbar関数の終わりに毎回破棄され、新しい関数はbar関数の始めに作成されます。 'self.foo = Foo()'を '__init __(self)'に追加すると、これら2つの例は機能的に等しくなります。つまり、誰かが 'xoo.foo.some_method()'を呼んで状態 'Foo'オブジェクトを変更することもできます。if xxxはClass Barのオブジェクトです – rth

答えて

1

このから始めて、一度にFoo()あるレベルをホイストします。 Fooはメソッド本体の間だけ存在します。

class Bar(object): 
    def __init__(self): 
     self.foo = Foo() 
    def bar(self): 
     self.foo.some_method() 

これはBarが作成されるたびに一度Fooを作成します。 Fooは、それを作成したBarが存在する限り存在します。

class Bar(object): 
    def __init__(self): 
     self.foo = None 
    def bar(self): 
     if self.foo is None: 
      self.foo = Foo() 
     self.foo.some_method() 

これはbarメソッドが呼び出されたときのみFooを作成する前の変異体です。 fooNoneの状態は、プロパティを使用して非表示にすることができます。

foo = Foo() 
class Bar(object): 
    def bar(self): 
     foo.some_method() 

これにより、Fooが1度だけ作成され、再利用されます。プログラムが終了するまでFooが存在します。

これらのどれも、それぞれ適用の瞬間がありません。

関連する問題