いずれの場合も2つのタイプのクラスプロパティ定義の違いは?右、
class Foo(object):
bar = 1
def __init__(self):
... etc.
と
class Foo(object):
def __init__(self):
... etc.
Foo.bar = 1
違いbar
がありますが、クラスのプロパティであり、それはクラスのすべてのインスタンスで同じですか?
いずれの場合も2つのタイプのクラスプロパティ定義の違いは?右、
class Foo(object):
bar = 1
def __init__(self):
... etc.
と
class Foo(object):
def __init__(self):
... etc.
Foo.bar = 1
違いbar
がありますが、クラスのプロパティであり、それはクラスのすべてのインスタンスで同じですか?
唯一の違いは、Foo.bar
は、Foo.bar = 1
ステートメントが実行されるまで存在しないが、最初のケースではクラスオブジェクトの作成時に既に利用可能であるということです。
2番目のケースで利用できるようになる前にFoo.bar
が必要なコードがない限り、コードには何の効果もありません。しかし、クラスの属性を知るためにスクロールダウンする必要がないため、最初のオプションは読みやすさの点で優れていると言えます。
独自のコードを書いている場合は、一緒に行く:このバージョンBecase
class Foo(object):
bar = 1
は:
class Foo(object):
pass
Foo.bar = 1
それは合法だにもかかわらず
あなたはそのが作成されて前にbar
属性にアクセスしようとすると、問題がある可能性があります:私は多くの違いが表示されないこと以外は
>>> class Foo:
... pass
...
>>> f = Foo()
>>> f.bar
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: 'Foo' object has no attribute 'bar'
>>> Foo.bar = 1
>>> f.bar # but hey, now you're ok!
1
を。
両方のバージョンが同じです(この回答の最後にあるテストのトランスクリプトを参照してください)。どちらの場合も、bar
はすべてFoo
の同じインスタンスです。インスタンス上bar
を読み取るインスタンスが作成される時点で
は、Foo
の値を読み取り、及びinstance.bar
が割り当てられるまでFoo.bar
に割り当て、インスタンスに反映されます。割り当ての瞬間に、インスタンスはそれ自身の__dict__
エントリを取得します。これは、クラスとは完全に独立しています。
In [62]: class Foo: pass
In [63]: Foo.bar = 1
In [64]: Foo.bar
Out[64]: 1
In [65]: f = Foo()
In [66]: f.bar
Out[66]: 1
In [67]: f.bar +=1
In [68]: f.bar
Out[68]: 2
In [69]: Foo.bar
Out[69]: 1
In [70]: Foo.bar +=3
In [71]: Foo.bar
Out[71]: 4
In [72]: g = Foo()
In [73]: g.bar
Out[73]: 4
In [74]: class Qux: bar = 1
In [75]: Qux.bar
Out[75]: 1
In [76]: q = Qux()
In [77]: q.bar
Out[77]: 1
In [78]: q.bar+=1
In [79]: q.bar
Out[79]: 2
In [80]: Qux.bar
Out[80]: 1
In [81]: Qux.bar +=1
In [82]: r = Qux()
In [83]: r.bar
Out[83]: 2
In [84]: q.bar
Out[84]: 2
In [85]: s = Qux()
In [87]: s.__dict__
Out[87]: {}
In [88]: q.__dict__
Out[88]: {'bar': 2}
In [89]: Qux.bar = 'foo'
In [90]: Qux.bar
Out[90]: 'foo'
In [91]: s.bar
Out[91]: 'foo'
-1は間違っています: "Foo"のインスタンスは "bar"のコピーではなく、クラス属性にアクセスします。 aninstance属性が設定されると、それ自身の属性を取得します。私の答えはhttp://stackoverflow.com/questions/9302789/changing-variables-in-multiple-python-instances/9304924#9304924 – jsbueno
@jsbueno:証明してください。この動作は、各インスタンスがクラスオブジェクト内の値のコピー(オブジェクトへのポインタ)を取得するのとまったく同じように見えます。 – Marcin
@jsbueno:私が自分の証拠を追加しました。あなたがリンクしている答えには、実際にあなたの立場の証拠はありません。 – Marcin
ありがとうございました。 – mcepl