2016-07-30 87 views
2
class A(object): 
    def foo(self): 
     print "A - foo" 
    def foo2(self): 
     print "foo2" 
     self.foo() 

class B(A): 
    def foo(self): 
     print "B - foo" 
    def foo2(self): 
     super(B, self).foo2() 

B().foo2() 

我試圖讓[senario1]:Python的超:調用它包含由派生類中重寫另一個基類方法的基類方法

foo2 
A - foo 

但得到了[senario2]:

foo2 
B - foo 

改爲。

我發現the explanation,但我想知道是否有一種方法得到[senario1]而不更改方法fooA類中的名稱?要做到這一點

+2

你可以改變'A.foo2',使其明確要求' A.foo(self)',但這不是一個很好的解決方案。我認爲最恰當的解決辦法是改變'B.foo'的名字。如果它不應該覆蓋'A.foo',那麼,不要覆蓋'A.foo'。 –

+0

我不知道會發生什麼,如果你在'B.foo2'裏面說'something .__ class__ = A',然後調用'self.foo2()',然後再次'self .__ class__ = B'。在一個簡單的例子中,我測試了這個按預期工作,可能是你想要的。 – Aguy

回答

2

一種方式是手工調用fooA,並通過self它:

class A(object): 
    def foo(self): 
     print("A - foo") 
    def foo2(self): 
     print("foo2") 
     A.foo(self) 

class B(A): 
    def foo(self): 
     print("B - foo") 
    def foo2(self): 
     super(B, self).foo2() 

B().foo2() 

這樣,你總是會呼籲Afoo。如果foo將調用self.foo(),如果再次調用B s foo方法。

1

正如萊昂指出,你可以簡單地通過硬編碼A.foo顯式調用並通過實例對象作爲參數訪問foo方法A類中,然而由於Rawing曾表示這不是很好的解決方案。其實這是錯誤的班級設計的例子。爲什麼?

  1. 試想一下,你會在數以百計的地方通過A.foo使用顯式調用一個更大的項目。現在,嘗試將您的A類重命名爲MagicUnicorn類。

  2. 這是違反直覺的。如果覆蓋B中的Afoo方法,那麼在99.9999%的情況下不需要fooA,因爲必須有重寫它的原因。

一個更好的解決方案,而不是使用顯式調用將重命名Bfoo(如Rawing說):

class A(object): 
    def foo(self): 
     print "A - foo" 
    def foo2(self): 
     print "foo2" 
     self.foo() 

class B(A): 
    def unicorn_foo(self): 
     print "B - foo" 
    def foo2(self): 
     super(B, self).foo2() 

B().foo2() 
相關問題