2016-05-19 211 views
2

我舉個例子。我有兩個班。 AB的超類。調用超類超類的方法

class A(object): 
    def p(self): 
     print "a" 


class B(A): 
    def p(self): 
     print "b" 
     super(A, self).p() 

現在我有一個新類C。類C是子類的B,應再次改寫方法p,這樣的:

class C(B): 
    def p(self): 
     print "c" 
     # here call the method p of the 'supersuper'class A 
     # without calling the method p of the superclass B 
    ... 

我如何可以覆蓋該方法的類CBp()和調用的方法p()超級超類A未調用超類的方法pB?有人有想法嗎?

P/S:方法名稱必須相同。

+1

嗯,它是Python,我們都在這裏同意大人,所以它可以讓你做類似'Ap(self)'的事情或者通過'self .__ mro__'手動行走,但是你的需求會破壞一些基本的繼承規則,它不會被很好地支持。 –

+0

是的,我知道,這不是很好。但我需要繼承一個類來改變他的方法而不需要編輯。 – qvpham

回答

5

只需直接撥打A.p(self),這不是super()被設計爲支持。請注意,您必須手動傳遞self,因爲A.p()是一個未綁定的方法。

但是,您想重新考慮您的班級設計。也許你想引入輔助方法;其中一個可以從A.p()C.p()調用,但不是B.p()?這樣B.p()將不必使用super().p()在所有,只是簡單地重用這些輔助方法。

+0

我們偶然發現了一個類似的問題 - 由不好的課程設計引起 - 但我們正在考慮做這樣的事情,以便通過沖刺。只要你不使用多重繼承,如果在'C'中做了'super(B,self).p()'這樣的事情,會有什麼潛在的破壞? (只問,因爲我知道你會知道的。) –

+2

@ Two-BitAlchemist:沒有什麼會中斷,因爲'A'然後總是層次結構中的下一個類。假設你從來沒有在某個地方通過多重繼承混合使用'A'或'B'。但是,明確的肯定比隱含的更好。你會記得,在一年之後,「super(B,self)」現在開始在'A'上搜索嗎? –

+0

我已根據您的答案構建了我的程序。現在它起作用了。謝謝Martijn – qvpham