2016-07-30 100 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() 
相关问题