首页 文章

从基类调用派生类中的Overriden方法

提问于
浏览
7

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

派生类可以覆盖其基类的方法 . 因为方法在调用同一对象的其他方法时没有特殊权限,所以调用同一基类中定义的另一个方法的基类方法最终可能会调用覆盖它的派生类的方法 . (对于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() 的对象可以某种方式最终打印"from B"?我读得对吗?如果对于python如何处理继承和覆盖有点困惑,我很抱歉 . 谢谢!

7 回答

  • 7

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

  • 1

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

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

    你也是

    obj = B()
    obj.foo()
    

    然后这将打印 from B 作为 foo() ,它在 base class 中定义,调用 bar() ,它也在基类中定义,但是 overridden in the derived class .

    至少这是我读它的方式 .

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

    输出:

    from A
    from B
    from B
    
  • 0

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

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

  • 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
    
  • 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
    
  • 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
    

相关问题