我有一个基类和一个子类。在基类中,我有一个在 __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)
我希望打印输出是“base”,但实际输出是“sub”。如何在 BaseClass
的 __init__
中显式调用 BaseClass.create_value(self, value)
来修改代码以获得“base”?
最佳答案
Python 是动态类型的。这意味着当你写
def __init__(self, value):
self.value = value
self.transformed_value = self.create_value(value)
在评估 self.create_value
时该方法属于哪个类并不重要:它只重要 self
的 type 是什么调用方法时。
当您调用 SubClass(3)
时,您最终会调用 SubClass.__init__
,它会立即调用 BaseClass.__init__
,并带有一个类型的参数子类
。由于定义了 SubClass.create_value
,这就是 self.create_value
解析的结果。
如果出于某种原因,您坚持 BaseClass.__init__
在其 self
参数上调用 BaseClass.create_value
,则您必须这样做显式地使用 BaseClass.create_value(self, value)
。然而,这很少是一个好主意。如果 self
的类型想要调用它重写的方法,它有责任通过使用 super
本身来实现:
def create_value(self, value):
rv = super().create_value()
print("sub")
return value + 2 # Or perhaps do something with rv first?
关于python - 调用 super().__init__() 时会给出错误的方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57042695/