子类使用构造超() - 越来越不受约束的方法__init __()
我想为孩子创造类的构造函数类方法,但我不能正确初始化实例。子类使用构造超() - 越来越不受约束的方法__init __()
我已阅读本网站上许多博客和答案,甚至试图究竟有些什么其他人发布的,依然无果。希望我错过了一些非常简单的事情。什么我想基本例如:
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__
方法是一个普通的实例方法,而不是一个类的方法。它需要它将要初始化的实例在被调用时已经被创建。您当前的代码失败的方式与A.__init__("foo")
失败的方式完全相同(这不是super
的错误)。
我怀疑你想被调用__new__
而非__init__
。 __new__
方法是负责创建实例的实际“构造函数”方法(通常通过将实际创建步骤委托给object.__new__
)。你并不需要使用super
或者,因为你已经没有覆盖,你继承了__new__
方法(从object
,因为A
没有任何覆盖它)。
但你实际上并不需要做,要么。您可以致电通过的cls
参数。调用类的构造情况下,以正常的方式:
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
回答谢谢,这是有道理的,是什么我想这个问题是,但在我的具体情况(实际我正在处理的代码),我没有在类B中覆盖基类init,因此超级。我试图用这个classmethod作为一个仍然是B实例但不遵循B的init进程的替代构造函数。具体来说,它用于加载之前保存为JSON的实例状态,并将其重建回其对象形式。这遵循不同的过程,然后从头创建一个新的对象。 – iceblueorbitz
啊,那么你可能想要做'self = cls .__ new __()',接着是'super(B,self).__ init __()'(需要任何参数)。如果'B'有自己想要绕过的'__new__'方法,你可能想调用'super(B,cls).__ new __(cls)'而不是'cls .__ new__',但是不应该如果您只需要绕过重写的__init__方法就必须。 – Blckknght
非常感谢,这非常有意义,而且似乎很重要,缺少来自我见过的许多其他帖子和主题的信息。我明白'__new__'经常被人忽视,但在我需要单独的逻辑重新加载JSON字典中的历史记录并重建对象时,它非常有用。 – iceblueorbitz
我很高兴你把我在被卡在新的点后提出新问题的建议。我知道你会实现它),是一加一的问题,对不起,如果我不能及时 –