我有一个基类和一个子类。在基类中,我有一个实例方法,在__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”。如何修改代码以获得“base”,而不显式调用BaseClass
的__init__
中的BaseClass.create_value(self, value)
?你知道吗
为了进一步补充@chepner的优雅回答,如果您希望父类调用自己的方法,您可以如下修改父类:
在上面的
BaseClass
中,我们正在创建一个对父方法的简单引用,并在它自己的__init__
方法中使用相同的引用。通过这样做,即使基类的方法被重写并且被子实例调用,我们也可以继续使用这个引用对象。你知道吗Python是动态类型的。也就是说当你写作的时候
在计算
self.create_value
时,is与该方法属于哪个类无关:它只与调用该方法时self
的类型有关。你知道吗当您调用
SubClass(3)
时,最终会调用SubClass.__init__
,它会立即使用SubClass
类型的参数调用BaseClass.__init__
。既然SubClass.create_value
是定义的,那就是self.create_value
的解析。你知道吗如果出于任何原因,您坚持
BaseClass.__init__
在其self
参数上调用BaseClass.create_value
,则必须显式地使用BaseClass.create_value(self, value)
。然而,这很少是个好主意。如果self
的类型希望调用它重写的方法,那么通过使用super
本身,这就是它的责任:相关问题 更多 >
编程相关推荐