使用 super() 的子 Class 构造函数 - 获取未绑定方法 __init__()

Child Class constructor using super() - getting unbound method __init__()

我正在尝试为子 class 创建 class 方法构造函数,但我无法正确初始化实例。

我在这个网站上阅读了很多博客和答案,甚至尝试了一些其他人发布的内容,但仍然无济于事。希望我错过了一些非常简单的东西。我正在尝试的基本示例:

class A(object):
    def __init__(self, foo):
        self.foo = foo

class B(A):

    @classmethod
    def make_new(cls):
        super(B, cls).__init__('bar')

foobar = B.make_new()

我一直收到未绑定方法错误:

TypeError: unbound method __init__() must be called with B instance as first argument (got str instance instead)

__init__方法是常规实例方法,不是class方法。它需要将要初始化的实例在调用时已经创建。您当前的代码失败的方式与 A.__init__("foo") 失败的方式完全相同(这不是 super 的错)。

我怀疑你想打电话给 __new__ 而不是 __init____new__ 方法是负责创建实例的实际 "constructor" 方法(通常将实际创建步骤委托给 object.__new__)。您也不需要使用 super,因为您没有覆盖您继承的 __new__ 方法(来自 object,因为 A 也没有覆盖它).

但您实际上也不需要这样做。您可以调用 cls 参数,您的 classmethod 已通过。调用 class 是构造实例的正常方法:

class B(A):
    @classmethod
    def make_new(cls):
        return cls("bar")  # note that you also need to `return` the instance you create!

如果 class 方法的目的是避免 运行 B.__init__,您可能需要这样的东西:

class B(A):
    @classmethod
    def make_new(cls):
        self = cls.__new__(cls)
        super(B, self).__init__('bar')
        return self