为什么从基类中在这里调用子方法?

时间:2018-08-12 10:37:40

标签: python inheritance super

当我从基类的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

1 个答案:

答案 0 :(得分:2)

这是所有多态语言所共有的。多态性的定义是,对象的实际(最派生)类型确定调用哪个版本的方法,即使您在调用点知道的只是它是某个超类的实例,

如果您需要重写此方法,并且绝对只能从超类init调用超类方法,请使用__set_state中的两个前划线将其命名。这将调用python的名称处理规则,以便子类无法(轻松地)覆盖该方法-但是,这也使它无法从外部代码中调用(或再次不容易调用)。但是多态行为通常是您想要的,这就是为什么它是Python中的默认行为(与之相反,例如C ++中的方法不是多态的,除非您明确将它们声明为virtual )。