Python類的繼承問題

2021-09-28 17:47:47 字數 2618 閱讀 9985

話不多說,直接上**:

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...