从基类调用派生类中的重写方法

时间:2010-06-18 23:43:32

标签: python inheritance

我正在阅读关于classes的Python文档,并且遇到了我不确定的这一段:

  

派生类可能会覆盖方法   他们的基类。因为方法   没有特权时   调用相同的其他方法   object,一种基类的方法   调用中定义的另一个方法   相同的基类最终可能会调用一个   派生类的方法   覆盖它。 (对于C ++程序员:   Python中的所有方法都是有效的   虚拟的。)

示例:

class A:
    def foo(self):
        self.bar()

    def bar(self):
        print "from A"

class B(A):
    def foo(self):
        self.bar()

    def bar(self):
        print "from B"

这是否意味着A obj = A()类的对象可以某种方式最终“从B”打印?我读得对吗?如果这没有意义,我道歉。关于python如何处理继承和覆盖,我有点困惑。谢谢!

7 个答案:

答案 0 :(得分:7)

没有。超类无法知道关于子类的任何信息。这意味着如果你实例化子类B,并且它继承方法foo()并覆盖方法bar(),那么当你调用foo()时,它将调用bar() B中的定义,而不是A中的bar()定义。这不是超类作者的意图 - 他希望他对bar()的调用符合他自己的定义。

答案 1 :(得分:1)

不,如果您有以下对象,则表示您:

class B(A):
    def bar(self):
        print "from B"

你做了

obj = B()
obj.foo()

然后这将打印from B作为foo(),其在基类中定义,调用bar(),它也在基类中定义,但在派生类中重写

至少这是我读它的方式。

答案 2 :(得分:1)

a = A()
a.foo()
b = B()
b.foo()
a.bar = b.bar
a.foo()

输出:

from A
from B
from B

答案 3 :(得分:0)

不,任何A对象都会调用A.bar并打印“from A

调用哪个重写方法取决于对象的内容,而不是从其类派生的其他类。将该类视为cookie切割器,将对象视为cookie。

答案 4 :(得分:0)

不完全是:

class A:
   def foo(self):
       self.bar()

   def foo2(self):
       self.bar2()

   def bar(self):
       print "Bar A"

   def bar2(self):
       print "Bar2 A"

class B(A):
   def bar(self):
       print "Bar B"

objA = A()
objA.foo()
objA.foo2()

objB = B()
objB.foo()
objB.foo2()

输出:

Bar A
Bar2 A
Bar B
Bar2 A

答案 5 :(得分:0)

我的回答并不一定与已发布的回答相矛盾,但它确实显示了一种方法,通过从继承的类中调用基类方法来使“从B”打印基类。基类仍然调用继承的类方法,因为它是从继承的self中工作的。也许这是该段所指的那种情况?

class A:
    def foo(self):
        self.bar()

    def bar(self):
        print("from A")

class B(A):
    def foo(self):
        super().foo()

    def bar(self):
        print("from B")


A().foo() #prints "from A"
B().foo() #prints "from B" but indirectly through the base class

答案 6 :(得分:0)

class A:
    def f(self):
        print 'a.f'
        self.g()

    def g(self):
        print 'a.g'

class B(A):
    def g(self):
        print 'b.g'

b = B()
b.f()

# a.f
# b.g