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?
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)