我通過嘗試學習繼承開始了我的 OOP 之旅。我在有關該主題的在線測驗中看到了此代碼,我希望有人可以向我解釋它,因為它對我來說毫無意義。
class A(object) :
def __init__(self, x) :
self._x = 2 * x
def m1(self, x) :
return self.m2(x) 2
def m2(self, x) :
return x - 1
class B(A) :
def m2(self, y) :
self._y = y
return self._x self._y
對于以下內容,如果我說 a = A(1),那么預期回報是多少?初始化將 1 乘以 2,所以現在 x 的實體的值為 2。方法 m1 會發生什么?它接收 X 的這個實體,但在回傳中它指的是 m2?那么 x=2 是先傳遞給 m2 然后將 1 的回傳傳遞給 m1 嗎?這增加了 2 嗎?
至于B類,我看到它改變了從A類繼承的m2方法,但是添加到y的x值,是從A類繼承的x值嗎?
對無休止的問題感到抱歉,但我才剛剛開始,似乎很難理清頭緒。
uj5u.com熱心網友回復:
弄清楚代碼做什么的最簡單方法是運行它。
>>> a = A(1)
>>> a.m1(10)
11
一個重要的事情要注意這里(從你的問題聽起來像是你可能會混淆)是的值x傳遞給A.__init__它不習慣于通過A.m1!因此A.m1(x),x 1無論您如何初始化A實體,都只會回傳。
>>> a = A(1000)
>>> a.m1(1)
2
>>> a.m1(10)
11
>>> a.m1(100)
101
好吧,如果我們以B同樣的方式做呢?
>>> b = B(1)
>>> b.m1(10)
14
現在它不同了,因為B.m2它不同于A.m2. 我們可以自己運行它們來查看:
>>> a.m2(10)
9
>>> b.m2(10)
12
a.m2(10)是因為9a.m2(x)是永遠只是x - 1不管是什么a._x是。
但是b.m2(10)回傳b._x 10,在這種情況下是 12 —— 所以b.m1(10)回傳加 2。如果我們b._x通過B用不同的值初始化我們來改變什么,結果會有所不同:
>>> b = B(2)
>>> b.m2(10)
14
>>> b.m1(10)
16
uj5u.com熱心網友回復:
您可以隨時跟蹤發生的情況:
...
class B(A) :
def m2(self, y) :
self._y = y
return self._x self._y
class B然后貌似Bx是m2被重寫:
class Bx:
def __init__(self, x) :
self._x = 2 * x
def m1(self, x) :
return self.m2(x) 2
def m2(self, y) :
self._y = y
return self._x self._y
所以這就是class B它繼承 A 時的樣子
uj5u.com熱心網友回復:
我會嘗試按順序回答您的問題:
如果您要說
a = A(1),__init__會將變數 self._x 設定為2。這不會改變,因為 在此之后您永遠不會編輯self._x變數。- 函式
m1和m2可以根據x您傳入的內容回傳任何內容。您的意思是self._x?是的,m2會在您呼叫時執行m1,m1因為任何數字x都會回傳x 1。
- 函式
a = A(1)只是實體化類A,這些方法只適用于A(x).m1(y),而如果包含a = A(1)您將執行a.m1(y).實體化類
B與任意數量(B(x))運行__init__()的功能A(super().init(args)與)x通過(嘗試自己喜歡的東西運行它b = B(2); print(b._x)!)。因此,self._x是2 * x您通過了B!您已經覆寫
m2()了類中的方法B,因此m2()fromA未在B.
如果您有任何其他問題,請發表評論,我會盡力回答!
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/357436.html
