2015-11-26 16 views
4

雖然與蟒蛇進行實驗,我意識到,這個代碼不會產生輸出我的預期:爲什麼在父類中更改'x'的值只會改變一個孩子的值?

class Parent(object): 
    x = 1 

class Child1(Parent): 
    pass 

class Child2(Parent): 
    pass 


print Parent.x, Child1.x, Child2.x 

Child1.x = 2 
print Parent.x, Child1.x, Child2.x 

Parent.x = 3 
print Parent.x, Child1.x, Child2.x 

上述代碼的輸出是:

1 1 1 
1 2 1 
3 2 3 

爲什麼是最後一行的輸出3 2 3而不是3 2 1?爲什麼更改Parent.x的值也會更改Child2.x的值,但同時不會更改Child1.x的值?

感謝

+0

因爲您將'x'的值更改爲3,即'Parent.x = 3' ..其中child2從父項中獲取x。 –

+0

如果你刪除Child1.x = 2它會是3 3 3 但是因爲你已經設置它的孩子它不會訪問父類的值 –

回答

4

當你分配給Child1.x,您創建了一個新的屬性只有Child1。但是,Child2沒有自己的x屬性,所以它繼承了Parent的版本,無論它的當前值是什麼。

1

就Python中定義的屬性而言,它具有寫入時複製行爲。由於Python中的每個變量都是一個參考,直到您爲Child1.x分配新值,Child1中的x引用的值爲Parent.x

事實上,你試圖做的一般是不好的做法!你不應該放置你想要修改的類定義的變量,直到你知道你在做什麼爲止。事實上,你的例子是濫用面向對象的範例,因爲你應該玩你的類的實例,而不是自己的類。

1

更加延長的答案作爲註釋 如果您添加到您的腳本

print Parent.__dict__ 
print Child1.__dict__ 
print Child2.__dict__ 

結束時,您得到關於類的所有成員,什麼是存入他們的詳細研究。 輸出將是

{'__dict__': <attribute '__dict__' of 'Parent' objects>, 'x': 3, '__module__': '__main__', '__weakref__': <attribute '__weakref__' of 'Parent' objects>, '__doc__': None} 
{'x': 2, '__module__': '__main__', '__doc__': None} 
{'__module__': '__main__', '__doc__': None} 

正如你在child1
'X' 看到:2 添加到字典。所以child1不會查找它的父類中的值,但是child2確實是

+0

好的答案,但我覺得太複雜的Python新手。 .. –

相關問題