本人剛剛接觸python不久, 在學習類繼承的時候遇到了一點疑惑, 如下:class A(object):
x = 1
class B(A):
B.x = 3 print(A.x) # 1print(B.x) # 1 print(id(A.x)) # 4363216224print(id(B.x)) # 4363216224在子類中試圖修改這個類屬性失敗但是如果我這樣改:class A(object):
x = 1
class B(A):
# B.x = 3
x = 3
print(A.x) # 1print(B.x) # 3 print(id(A.x)) # 4363216224print(id(B.x)) # 4363216256父類和子類中的類屬性x就不一樣了, 個人的疑惑如下:在第一種情況中, 似乎無法修改子類的類屬性, 請問這是什么原因?第二種情況, 似乎是在B中重新創(chuàng)造了一個類屬性x, 不知道是不是這么理解?總體感覺很混淆, 沒有一個清晰的概念來理清這兩段代碼, 希望能有各位前輩能指點一下, 不勝感激!更新:感謝各位前輩的回答, 我用的是3.6, 不過當時是用的jupyter notebook編輯代碼的, 運行是沒問題, 但是剛剛自己在別的ide上面試了一下, 確實會報錯, 個人也很迷糊, 不知道是什么情況.jupyter notebook截圖如下:所以現(xiàn)在我也很不理解, 有沒有別的前輩出現(xiàn)過這樣的情況?
2 回答

慕絲7291255
TA貢獻1859條經驗 獲得超6個贊
1: 這是因為這個是類屬性,類屬性可以通過類或者實例來訪問,當你創(chuàng)建一個類的實例的時候,所有的類屬性都會復制一份給這個實例,假設有
class A:
x = 1
a = A()
b = A()
此時a,b都從類那里得到了類屬性x, 用實例也就是a, b都可以訪問x, 也可以去修改它,但是它們互不影響
a.x = 2
b.x = 3
此時打印a.x 為2 b.x 為3,A.x 為 1
總之類屬性要通過類來修改,創(chuàng)建的實例都有類屬性的一份復制。
2:這里是你重寫了類的屬性,你在子類當中的修改不能影響到父類,要用父類來操作,不然就亂套了。
添加回答
舉報
0/150
提交
取消