当我从基类的set_state()
方法中调用childs方法__init__()
时,我不明白为什么在这里调用它:
class base():
def __init__(self, x):
self.set_state(x)
def set_state(self, x):
self.x = x
print("base")
class child(base):
def __init__(self, x, y):
super().__init__(x)
self.set_state(y)
def set_state(self, y):
self.y = y
print("child")
test = child(1, 2)
输出为:
child
child
答案 0 :(得分:2)
这是所有多态语言所共有的。多态性的定义是,对象的实际(最派生)类型确定调用哪个版本的方法,即使您在调用点知道的只是它是某个超类的实例,
如果您需要重写此方法,并且绝对只能从超类init调用超类方法,请使用__set_state
中的两个前划线将其命名。这将调用python的名称处理规则,以便子类无法(轻松地)覆盖该方法-但是,这也使它无法从外部代码中调用(或再次不容易调用)。但是多态行为通常是您想要的,这就是为什么它是Python中的默认行为(与之相反,例如C ++中的方法不是多态的,除非您明确将它们声明为virtual
)。