2009-05-16 8 views
15

私は、静的なままにしたい複合データメンバーを持つクラスを持っています。私はそれを関数を使って一度初期化したい。Pythonic Way Initialize(Complex)静的データメンバー

def generate_data(): 
    ... do some analysis and return complex object e.g. list ... 

class Coo: 
    data_member = generate_data() 
    ... rest of class code ... 

機能generate_dataが完了するまでに長い時間がかかり、実行中のプログラムの範囲で一定のままデータを返します。Python的にはこのようなものである方法。クラスCooがインスタンス化されるたびに実行する必要はありません。

data_member__init__に何も割り当てていない限り、それは "静的"のままですか? Cooのメソッドがdata_memberに何らかの値を追加すると(それがリストであると仮定して)、この追加は他のインスタンスでも利用できるのでしょうか?

ありがとうございました

+0

そのコードに関するPython以外の唯一のものは、クラス名に小文字の識別子を使用していることです。 –

+0

@Card:もちろん、あなたは正しい、私はそれを変更しました:) –

答えて

14

あなたはすべての点で正しいです。 data_memberが1度作成され、cooのすべてのインスタンスで使用できるようになります。いずれかのインスタンスがそれを変更すると、その変更は他のすべてのインスタンスに表示されます。その出力は最後に表示してここ

は、このすべてを示す例です:

def generate_data(): 
    print "Generating" 
    return [1,2,3] 

class coo: 
    data_member = generate_data() 
    def modify(self): 
     self.data_member.append(4) 

    def display(self): 
     print self.data_member 

x = coo() 
y = coo() 
y.modify() 
x.display() 

# Output: 
# Generating 
# [1, 2, 3, 4] 
+0

クラスの外にあるものはどうなりますか? –

+0

@Omega:これは同じです - モジュールスコープで "module_data = generate_data()"と言うだけです。 – RichieHindle

6

class coo: ...が実行されたときの文data_member = generate_data()は、一度だけ実行されます。ほとんどの場合、クラス・ステートメントはモジュール・レベルで発生し、モジュールのインポート時に実行されます。したがって、最初にcooクラスのモジュールをインポートすると、data_member = generate_data()が1回だけ実行されます。

cooクラスのすべてのインスタンスはdata_memberを共有し、を書き込むことによってそれにアクセスすることができます。 への変更は、cooインスタンスによって直ちに表示されます。インスタンスは独自のdata_member属性を持つことができます。この属性は、self.data_member = ...と入力して設定でき、そのインスタンスにのみ表示されます。 "static" data_memberには、と入力してもアクセスできます。

13

他の人があなたは正しい答えてきたように - 私はに注意するもう一つを追加します:インスタンスはオブジェクト自体を変更する場合、例えば

self.data_member.append('foo') 

その後、変更がで見られています残りのインスタンスあなたは

self.data_member = new_object 

を行う場合は、新しいインスタンスメンバーは、クラスのメンバをオーバーライドし、そのインスタンスではなく、他の人にのみ表示され作成されます。その差異が常に見つかるとは限りません。たとえば、self.data_member += 'foo'self.data_member = self.data_member + 'foo'です。

これを避けるには、オブジェクトを常に(selfではなく)と指定する必要があります。

+0

+1、特にインスタンス属性ではなくクラス属性としての参照について、いくつかの良い点を+1してください。 –

関連する問題