請看下面的代碼。部分解釋如下:
B 的建構式通過 line 呼叫其直接超類的建構式
super().__init__(y)(super()回傳對直接超類的參考)。因此,物件b繼承了屬性x,并且它的值被設定為,因為當沒有提供引數時2,這是建構式中的默認值。B因此,在
b創建物件后,b.x其值為2。”
我的問題是:如何b.x獲得價值2?既然超類 ( )在其建構式中有,那么 class 不應該B也super().__init__()包含一個x變數嗎?Ax
我的觀察是,無論 y 的值在 classB自己的建構式中(在本例中y=2),它都成為b.x
class A:
def __init__(self, x=5):
self.x = x
class B(A):
def __init__(self, y=2):
super().__init__(y)
def set(self, y):
self.x = y 3
return self.x
b = B()
print(b.set(b.x 2))
#結果為 7
uj5u.com熱心網友回復:
您呼叫的事實與初始化程式接受名稱中的引數super().__init__(y)這一事實無關。僅當您按關鍵字傳遞名稱時,收到的名稱才重要。如果您想通過關鍵字傳遞名稱,顯然是行不通的(沒有收到名為的引數),但可以正常作業,因為呼叫者呼叫自己的變數(或缺少變數)無關緊要傳遞文字值時),重要的是它傳遞到正確的位置或使用正確的關鍵字名稱。Axsuper().__init__(y=y)Aysuper().__init__(x=y)
您的玩具示例非常奇怪(子類違反了 Liskov 替換原則,在這種情況下B(y=1)有效,但A(y=1)不起作用),這可能會讓您更加困惑,但它提出的觀點是有效的:當您按位置傳遞引數時,它不會無論接收者如何呼叫引數,呼叫者如何呼叫它也無關緊要。
uj5u.com熱心網友回復:
這是因為您在創建超類建構式時為 x 分配了一個新值,因此您可以從 super() 中洗掉 y。init (y),這應該給你原始值 x=5
例子:
class A:
def __init__(self, x=5):
self.x = x
class B(A):
def __init__(self, y=2):
super().__init__() # removed y
def set(self, y):
self.x = y 3
return self.x
b = B()
print(b.set(b.x 2))
希望有幫助
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/464915.html
下一篇:學生課堂上的計算
