![](/img/trans.png)
[英]Python super: calling a base class method which contains another base class method that is overriden by derived class
[英]Calling Overriden Methods in Derived Class from Base Class
我正在阅读关于类的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()
的对象可以某种方式最终打印“从B”? 我读得对吗? 如果这没有意义,我道歉。 关于python如何处理继承和覆盖,我有点困惑。 谢谢!
没有。超类无法知道关于子类的任何信息。 这意味着如果你实例化子类B,并且它继承了一个方法foo()
,并覆盖一个方法bar()
,那么当你调用foo()
时,它将调用B中的bar()
定义,而不是bar()
A中的bar()
定义。这不是超类作者的意图 - 他希望他对bar()
调用能够达到他自己的定义。
不,如果您有以下对象,则表示您:
class B(A):
def bar(self):
print "from B"
你也是
obj = B()
obj.foo()
然后这from B
打印为foo()
,它在基类中定义,调用bar()
,它也在基类中定义,但在派生类中被重写 。
至少这是我读它的方式。
a = A()
a.foo()
b = B()
b.foo()
a.bar = b.bar
a.foo()
输出:
from A
from B
from B
我的答案不一定与已发布的答案相矛盾,但它确实显示了一种方法,通过从继承的类调用基类方法来使基类打印“从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
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
不,任何作为A
对象都会调用A.bar
并打印“ from A
”
调用哪个重写方法取决于对象是什么,而不是从其类派生的其他类。 将类视为cookie切割器,将对象视为cookie。
不完全是:
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
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.