2011-10-18 4 views

答えて

49

class A(object): 
    foo = None 

すなわち

あなたは属性は、クラスのすべてのインスタンスで共有されるようにしたい場合は、クラス属性を使用します。

class A(object): 
    foo = None 

これは('foo',None)を引き起こし(key,value)のペアはA.__dict__になります。

あなたは、属性がインスタンスごとにカスタマイズできるようにしたい場合は、インスタンスの属性を使用します。

class A(object): 
    def __init__(self): 
     self.foo = None 

これはa=A()Aのインスタンスであるa.__dict__(key,value)ペアであることを('foo',None)の原因となります。

+1

私はそれらがどちらの場合でもインスタンスにバインドされていると思っていました...ありがとう:) – fortran

+6

Pythonには複雑な[属性ルックアップ規則]があります(http://www.cafepy.com/article/python_attributes_and_methods/ python_attributes_and_methods.html)。記述子に入ることなく、この場合、 'a .__ dict__'が最初に' foo'キーのために検索され、見つからなければ 'A .__ dict__'が検索されます。これは 'foo'がクラス属性であっても' a.foo'を使う理由です。 – unutbu

+1

また、クラス属性の場合、 'a.foo = whatever'を実行すると、実際にはクラス属性を隠す新しいインスタンス属性が作成されることになります。 'A.foo'は変更されません。あなたは 'a.foo'で' .foo'の値にアクセスできますが、それに割り当てると新しいインスタンス属性が作成されるので、ちょっとした問題です。 – Kat

2

クラス定義で定義された属性はJavaの静的変数と同じですが、初期化子で設定された属性はインスタンス属性です(self.something = 1something = 1の違いに注意してください)。詳細はthis question、詳細についてはthis oneを参照してください。クラスレベルの定義では属性にデフォルト値が与えられるため、これら2つのケースの間には実用的な違いはほとんどありませんが、オブジェクトインスタンスを使用する前にある種のロジックを使用して属性を設定する場合は、方法は__init__()です。

関連する問題