调用 super().__init__() 在被覆盖时给出了错误的方法

kan*_*lor 5 python inheritance super

我有一个基类和一个子类。在基类中,我有一个实例方法,它在__init__. 在子类中,我覆盖了这个方法。将super()在子类调用不会调用原始基本方法,但重写的子类的方法。为什么?

class BaseClass:
    def __init__(self, value):

        self.value = value
        self.transformed_value = self.create_value(value)

    def create_value(self, value):

        print("base")
        return value + 1

class SubClass(BaseClass):
    def __init__(self, value):

        super().__init__(value)

    def create_value(self, value):
        print("sub")
        return value + 2

s = SubClass(3)
Run Code Online (Sandbox Code Playgroud)

我希望打印输出是“基本”,但实际输出是“子”。我如何修改代码即可获得“基地”没有显式调用BaseClass.create_value(self, value)__init__BaseClass

che*_*ner 4

Python 是动态类型的。这意味着当你写

def __init__(self, value):
    self.value = value
    self.transformed_value = self.create_value(value)
Run Code Online (Sandbox Code Playgroud)

在求值时该方法属于哪个类并不重要self.create_value:它只在调用该方法时关心该方法的类型。self

当您调用时SubClass(3),您最终会调用SubClass.__init__,它会立即BaseClass.__init__使用类型参数进行调用SubClass。既然SubClass.create_value已经定义了,那就self.create_value解决了。

如果出于某种原因,您坚持对其论点BaseClass.__init__进行调用,则必须使用 明确地这样做。然而,这并不是一个好主意。如果 的类型想要调用它重写的方法,则有责任通过使用自身来执行此操作:BaseClass.create_valueselfBaseClass.create_value(self, value)selfsuper

def create_value(self, value):
    rv = super().create_value()
    print("sub")
    return value + 2  # Or perhaps do something with rv first?
Run Code Online (Sandbox Code Playgroud)