我正在阅读关于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如何处理继承和覆盖,我有点困惑。谢谢!
答案 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