我有2個類 - 將A和B作爲父類的一個類添加到一個類-child類中,並且A和B類都有一個方法myMethod。 現在,如果我在子類中調用mymethod,哪一個參考?如果子類調用擴展了兩個具有相同方法名稱的類,那麼哪個方法會調用子類調用
1
A
回答
5
它要求無論哪個首先出現在方法解析順序(MRO),這取決於這些子類繼承被定義的順序:
>>> class A(object):
def method(self):
print('A.method')
>>> class B(object):
def method(self):
print('B.method')
>>> class C(A, B):
#^A appears first in definition
pass
>>> C.mro()
[<class '__main__.C'>, <class '__main__.A'>, <class '__main__.B'>, <type 'object'>]
#^and therefore is first in the MRO
>>> C().method()
A.method # so that's what gets called
爲了確保的所有實現方法被調用,您可以使用super
,這將讓接下來的實施「向上」的MRO:
>>> class A(object):
def method(self):
print('A.method')
super(A, self).method() # this will be resolved to B.method for C
>>> class B(object):
def method(self):
print('B.method')
>>> class C(A, B):
pass
>>> C.mro() # same as before
[<class '__main__.C'>, <class '__main__.A'>, <class '__main__.B'>, <type 'object'>]
>>> C().method()
A.method
B.method
請注意,在做這件事情時你必須小心謹慎,因爲你有多重繼承,因爲加入super
到B.method
會嘗試呼叫object.method
,而不是實現。
0
它會調用A.我相信它使用層次結構中的第一個,但是我不完全熟悉Python的模型。我只是,雖然這個小樣本進行了測試:
class A():
def myMethod(self):
print("This is A!")
class B():
def myMethod(self):
print("This is B!")
class child(A,B):
def test(self):
self.myMethod()
test = child()
test.test()
相關問題
- 1. 在java中,如果我從子類調用一個調用overriden方法的超類方法,那麼將調用哪個類的方法?
- 2. 不同類型的具有相同名稱的調用方法
- 3. 調用匿名類的子類方法
- 4. 子類如何使用子類的相同方法名稱調用超類的方法?
- 5. 調用子類的方法
- 6. 調用子類的方法
- 7. 調用子類的方法
- 8. 如果兩個方法名稱相同,如何從使用該特徵的類方法調用traits方法?
- 9. 擴展使用類別具有相同方法的類名
- 10. 調用超類方法後調用子類方法
- 11. Java調用子類方法
- 12. UIViewController子類調用方法
- 13. 如果在父類和子類中有兩個名稱相同的方法..?
- 14. 爲什麼從基類調用方法調用子方法?
- 15. 超類的子類的調用方法
- 16. 超類的子類的調用方法
- 17. 子類調用父類的方法
- 18. 調用超類的子類方法
- 19. Objective-C:子類的調用類方法
- 20. 如何調用基類方法而不是擴展類方法
- 21. 確定哪個子類正在調用父類'方法
- 22. 從超類調用子類方法
- 23. Actionscript:從子類調用超類方法
- 24. 找到子類中的哪個方法調用基類中的方法
- 25. 爲什麼不調用子類方法?
- 26. 如果類的超類都具有相同的方法,如何區分要調用哪個超類?
- 27. 擴展類和調用超級方法
- 28. 調用擴展類方法問題
- 29. Xcode擴展類調用方法:sigabrt
- 30. 調用擴展方法到新類
謝謝...此外,如果你可以告訴大家,在情況下,它調用A,然後我要訪問的方法B中,我將如何調用myMethod的B中呢? ?? –
您能明確重新定義MRO嗎? –
在python3中,你可以使用'super()。method()',在舊的python中並不是那麼簡單。 – skyking