2012-03-06 8 views
1
>>> class Test(object): 
... test = {} 
... 
>>> class Test2(Test): 
... pass 
... 
>>> Test2.test.update({1:2}) 
>>> Test.test 
{1: 2} 
>>> 

私は{}を期待していました。古いスタイルのクラスでも起こります。拡張クラスからdict属性を更新すると、基本クラスが更新されます。どうして?

+0

どうしてあなたは何か違う説明をしますか? 「test」クラス属性のTest2インスタンスはどこから来ますか?純粋な魔法? – jsbueno

答えて

1

updateの仕組みには何も変わりありません。ポイントは、testclass 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セッションを見てみましょう。

2

はあなたがすべてのサブクラスを自動的に取得したい場合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

+0

ごめんなさい。私は本当に属性を隠そうとしていませんでした。 – MarkSteve

+0

属性自体を設定しても、基本クラスは更新されません。辞書の更新方法には奇妙なことがあります。 – MarkSteve

0
Test2.test.update({1:2}) 

これは、Test2によって継承された基本クラスTest属性を更新します。

あなたがやる、それらのそれぞれが、独自の辞書を持っているしたい場合:あなただけのアクションで見てきたデータの継承、:

>>> class Test(object): 
...  test = {} 
... 
>>> class Test2(Test): 
...  test = {} 
... 
>>> Test2.test.update({1:2}) 
>>> Test.test 
{} 
>>> 

Pythonは、私はとても好きな機能を持っています。

0

これは参考資料です。例えば取る:

>>> 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 
{} 
0

これらは同じオブジェクトであるためです。より正確には、Test2.testは、Test.testと同じものにアクセスする方法です。ローカルに見つからない場合は、スーパークラスで検索されるためです。

私はなぜあなたが異なっていると思いますか分かりません。 (それは私が考えることができる他のどの言語でもあなたが期待しているようには動作しません)。

関連する問題