在线观看不卡亚洲电影_亚洲妓女99综合网_91青青青亚洲娱乐在线观看_日韩无码高清综合久久

鍍金池/ 問答/Java  Python  C/ python 子類的類屬性疑惑?

python 子類的類屬性疑惑?

本人剛剛接觸python不久, 在學習類繼承的時候遇到了一點疑惑, 如下:

class A(object):
    x = 1
    
class B(A):
    B.x = 3 

print(A.x) # 1
print(B.x) # 1   
print(id(A.x)) # 4363216224
print(id(B.x)) # 4363216224

在子類中試圖修改這個類屬性失敗

但是如果我這樣改:

class A(object):
    x = 1
    
class B(A):
    # B.x = 3
    x = 3 
    
print(A.x) # 1
print(B.x) # 3   
print(id(A.x)) # 4363216224
print(id(B.x)) # 4363216256

父類和子類中的類屬性x就不一樣了, 個人的疑惑如下:

  • 在第一種情況中, 似乎無法修改子類的類屬性, 請問這是什么原因?
  • 第二種情況, 似乎是在B中重新創(chuàng)造了一個類屬性x, 不知道是不是這么理解?

總體感覺很混淆, 沒有一個清晰的概念來理清這兩段代碼, 希望能有各位前輩能指點一下, 不勝感激!



更新:

感謝各位前輩的回答, 我用的是3.6, 不過當時是用的jupyter notebook編輯代碼的, 運行是沒問題, 但是剛剛自己在別的ide上面試了一下, 確實會報錯, 個人也很迷糊, 不知道是什么情況.

jupyter notebook截圖如下:

clipboard.png

所以現(xiàn)在我也很不理解, 有沒有別的前輩出現(xiàn)過這樣的情況?

回答
編輯回答
愚念

1: 這是因為這個是類屬性,類屬性可以通過類或者實例來訪問,當你創(chuàng)建一個類的實例的時候,所有的類屬性都會復(fù)制一份給這個實例,假設(shè)有
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)建的實例都有類屬性的一份復(fù)制。

2:這里是你重寫了類的屬性,你在子類當中的修改不能影響到父類,要用父類來操作,不然就亂套了。

2017年9月23日 11:02
編輯回答
逗婦惱

你的B.x = 3一般都會報錯,可能你的Python版本比較特殊,我個人理解是在B類里創(chuàng)建了一個叫B.x的屬性,與A中的x已經(jīng)沒有關(guān)系了,所以直接繼承A中的x屬性。第二種寫法是重載了x屬性,使得BAx屬性不同。

2018年1月12日 12:29
編輯回答
局外人

我這邊python報錯.
2.7

Traceback (most recent call last):
  File "C:/work/python_proj/Odoo-erp_test/Src/ww.py", line 5, in <module>
    class B(A):
  File "C:/work/python_proj/Odoo-erp_test/Src/ww.py", line 6, in B
    B.x = 3
NameError: name 'B' is not defined

==============================
更新
我覺得B.x = 3這句話的意思python解釋器會理解為 B.B.x = 3 所以報錯.

2017年8月24日 06:07
編輯回答
貓館

請問你的 Python 版本是什么,我嘗試了使用 2.73.6 版本的 Python 執(zhí)行你這段代碼,但是都出現(xiàn)了錯誤:

Traceback (most recent call last):
  File "Test.py", line 7, in <module>
    class B(A):
  File "Test.py", line 8, in B
    B.x = 3
NameError: name 'B' is not defined
2017年6月9日 11:00