我正在尝试为子类创建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)
答案 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