話不多說,直接上**:
class
parent
(object):
x =1class
child1
(parent)
:pass
class
child2
(parent)
:pass
print
(parent.x, child1.x, child2.x)
child1.x =
2print
(parent.x, child1.x, child2.x)
parent.x =
3print
(parent.x, child1.x, child2.x)
"""執行結果:
1 1 1
1 2 1
3 2 3
"""
我對這段**最大的疑問是為什麼最後一行的輸出是 3 2 3 卻不是 3 2 1 ?
原來,在python 中,類變數在內部是作為字典處理的。如果乙個變數名沒有在當前類的字典中發現,將會向上搜尋祖先類直到被引用的變數名被找到為止。(如果這個變數名既沒有在自己所在的類又沒有在祖先類中找到,會引發乙個attributeerror異常 )
下面我們逐行分析一下:
class
parent
(object):
x =1class
child1
(parent)
:pass
class
child2
(parent)
:pass
print
(parent.x, child1.x, child2.x)
print(id
(parent.x),id
(child1.x),id
(child2.x)
)"""
執行結果:
1 1 1
140709706773328 140709706773328 140709706773328
"""
class
parent
(object):
x =1class
child1
(parent)
:pass
class
child2
(parent)
:pass
print
(parent.x, child1.x, child2.x)
print(id
(parent.x),id
(child1.x),id
(child2.x)
)child1.x =
2print
(parent.x, child1.x, child2.x)
print(id
(parent.x),id
(child1.x),id
(child2.x)
)"""
執行結果:
1 1 1
140709706773328 140709706773328 140709706773328
1 2 1
140709706773328 140709706773360 140709706773328
"""
class
parent
(object):
x =1class
child1
(parent)
:pass
class
child2
(parent)
:pass
print
(parent.x, child1.x, child2.x)
print(id
(parent.x),id
(child1.x),id
(child2.x)
)child1.x =
2print
(parent.x, child1.x, child2.x)
print(id
(parent.x),id
(child1.x),id
(child2.x)
)parent.x =
3print
(parent.x, child1.x, child2.x)
print(id
(parent.x),id
(child1.x),id
(child2.x)
)"""
執行結果:
1 1 1
140709706773328 140709706773328 140709706773328
1 2 1
140709706773328 140709706773360 140709706773328
3 2 3
140709706773392 140709706773360 140709706773392
"""
總結:在繼承中,所有子類中的變數 x 原本都是引用父類中變數 x 的儲存空間,但是child1中的變數 x 單獨指向了另一塊儲存空間。 python 類 繼承 python 類的繼承
1 所用的類都可以被繼承 2 沒有繼承其他類的類必然有乙個父類 object 3子類可以擁有父類的 init 裡的類容 派生子類除了父類的一些屬性,還會有自己的屬性和方法,這些就叫派生 如何使用 實現 class animal def init self,name,attack,hp self.na...
python繼承問題 Python繼承問題
我實際上遇到問題的 很長,所以我做了乙個顯示我的問題的例子.我有兩個繼承自基類 baseclass 的類.這兩個類都為self.dict新增了一些元素.然而,它們似乎交叉汙染元素.我期待c0.dict返回和c1.dict返回.但是它們都返回.為什麼它們會交叉汙染?class baseclass de...
Python 類的繼承
有兩個模組 file1.py 和 file2.py file2中有個基類base def abc self return function abc and name self class base object def init self,name self.name name defrun sel...