gpt4 book ai didi

python - 调用 super().__init__() 时会给出错误的方法

转载 作者:太空宇宙 更新时间:2023-11-03 15:32:44 25 4
gpt4 key购买 nike

我有一个基类和一个子类。在基类中,我有一个在 __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 时该方法属于哪个类并不重要:它只重要 selftype 是什么调用方法时。

当您调用 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com