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

标签 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)

我希望打印输出是“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/

相关文章:

python - 关于继承和 super()

java - 在父类(super class)的所有子类上调用方法?

python - 通过重写 CrawlSpider __init__() 方法来实现 scrapy 规则

python - 如何在Django中实现交易和账户系统?

python - fastapi 依赖 vs 中间件

python - 如何在Python中按字母顺序对字符串中的字母进行排序

javascript - 如何扩展谷歌地图类?

Python 过滤器/最大组合 - 检查空迭代器

c# - 同时使用继承和依赖注入(inject)

javascript - 在javascript中调用祖父函数