>>> class Test(object):
... test = {}
...
>>> class Test2(Test):
... pass
...
>>> Test2.test.update({1:2})
>>> Test.test
{1: 2}
>>>
私は{}を期待していました。古いスタイルのクラスでも起こります。拡張クラスからdict属性を更新すると、基本クラスが更新されます。どうして?
>>> class Test(object):
... test = {}
...
>>> class Test2(Test):
... pass
...
>>> Test2.test.update({1:2})
>>> Test.test
{1: 2}
>>>
私は{}を期待していました。古いスタイルのクラスでも起こります。拡張クラスからdict属性を更新すると、基本クラスが更新されます。どうして?
update
の仕組みには何も変わりありません。ポイントは、test
がclass attributeであり、クラス属性がクラス間で共有されていることです(他の人にtest
を再バインドするまで)。クラスは作品がクラスの下Data Model Reference見属性の方法について詳細な情報については
>>> class Test(object):
... test = {}
...
>>> class Test2(Test):
... pass
...
>>> id(Test.test)
32424144
>>> id(Test2.test)
32424144
>>> Test.test.update({1:2})
>>> Test2.test
{1: 2}
>>> Test2.test = {}
>>> id(Test2.test)
32424480
>>> Test.test
{1: 2}
>>> Test2.test
{}
>>> del Test2.test
>>> Test2.test
{1: 2}
:
は、このIDEセッションを見てみましょう。はあなたがすべてのサブクラスを自動的に取得したい場合Test2._Test__test
代わり
で見つけることができるため、属性をいじる属性の
>>> class Test(object):
... __test = {}
...
>>> class Test2(Test):
... pass
...
>>> Test2.__test.update({1:2})
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: type object 'Test2' has no attribute '__test'
をいじるクラス/属性を有効にするには2アンダースコアを使用する必要があります自分自身の__test
属性のメタクラスを使用することができますTest
Test2.test.update({1:2})
これは、Test2によって継承された基本クラスTest属性を更新します。
あなたがやる、それらのそれぞれが、独自の辞書を持っているしたい場合:あなただけのアクションで見てきたデータの継承、:
>>> class Test(object):
... test = {}
...
>>> class Test2(Test):
... test = {}
...
>>> Test2.test.update({1:2})
>>> Test.test
{}
>>>
Pythonは、私はとても好きな機能を持っています。
これは参考資料です。例えば取る:
>>> class Test(object):
... val = 1
...
>>> class Test2(Test):
... pass
...
>>> Test2.val = 2
>>> Test.val
1
ここでvalが同じオブジェクトを参照し、任意の更新/追記がスーパークラスで表示されます両方のリストや辞書2.
に再割り当てされるサブクラスのため。ただし、再交渉の場合:
>>> class Test(object):
... test = {}
...
>>> class Test2(Test):
... pass
...
>>> Test2.test = {1:2}
>>> Test.test
{}
これらは同じオブジェクトであるためです。より正確には、Test2.test
は、Test.test
と同じものにアクセスする方法です。ローカルに見つからない場合は、スーパークラスで検索されるためです。
私はなぜあなたが異なっていると思いますか分かりません。 (それは私が考えることができる他のどの言語でもあなたが期待しているようには動作しません)。
どうしてあなたは何か違う説明をしますか? 「test」クラス属性のTest2インスタンスはどこから来ますか?純粋な魔法? – jsbueno