私は、Pythonのオブジェクトの属性を初期化するためのベストプラクティスがクラスの本体か__init__
の機能の中にあるのか疑問に思っていましたか?Pythonクラスの属性初期化/宣言:それらを配置する場所は?
class A(object):
def __init__(self):
self.foo = None
私は、Pythonのオブジェクトの属性を初期化するためのベストプラクティスがクラスの本体か__init__
の機能の中にあるのか疑問に思っていましたか?Pythonクラスの属性初期化/宣言:それらを配置する場所は?
class A(object):
def __init__(self):
self.foo = None
対
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)
の原因となります。
クラス定義で定義された属性はJavaの静的変数と同じですが、初期化子で設定された属性はインスタンス属性です(self.something = 1
とsomething = 1
の違いに注意してください)。詳細はthis question、詳細についてはthis oneを参照してください。クラスレベルの定義では属性にデフォルト値が与えられるため、これら2つのケースの間には実用的な違いはほとんどありませんが、オブジェクトインスタンスを使用する前にある種のロジックを使用して属性を設定する場合は、方法は__init__()
です。
私はそれらがどちらの場合でもインスタンスにバインドされていると思っていました...ありがとう:) – fortran
Pythonには複雑な[属性ルックアップ規則]があります(http://www.cafepy.com/article/python_attributes_and_methods/ python_attributes_and_methods.html)。記述子に入ることなく、この場合、 'a .__ dict__'が最初に' foo'キーのために検索され、見つからなければ 'A .__ dict__'が検索されます。これは 'foo'がクラス属性であっても' a.foo'を使う理由です。 – unutbu
また、クラス属性の場合、 'a.foo = whatever'を実行すると、実際にはクラス属性を隠す新しいインスタンス属性が作成されることになります。 'A.foo'は変更されません。あなたは 'a.foo'で' .foo'の値にアクセスできますが、それに割り当てると新しいインスタンス属性が作成されるので、ちょっとした問題です。 – Kat