使用super()的子类构造函数 - 获取未绑定的方法__init __()

时间:2017-08-01 05:47:37

标签: python-2.7 constructor superclass class-method

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

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

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)

1 个答案:

答案 0 :(得分:2)

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

我怀疑您想要拨打__new__而不是__init____new__方法是实际的"构造函数"负责创建实例的方法(通常通过将实际创建步骤委托给object.__new__)。您也不需要使用super,因为您没有覆盖您继承的__new__方法(来自object,因为A没有#&# 39; t覆盖它。)。

但你实际上也不需要这样做。您只需调用cls传递的classmethod参数即可。调用类是构造实例的常规方法:

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

如果类方法的目的是避免运行B.__init__,则可能需要以下内容:

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