子类使用构造超() - 越来越不受约束的方法__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) 
+0

我很高兴你把我在被卡在新的点后提出新问题的建议。我知道你会实现它),是一加一的问题,对不起,如果我不能及时 –

__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 
+0

回答谢谢,这是有道理的,是什么我想这个问题是,但在我的具体情况(实际我正在处理的代码),我没有在类B中覆盖基类init,因此超级。我试图用这个classmethod作为一个仍然是B实例但不遵循B的init进程的替代构造函数。具体来说,它用于加载之前保存为JSON的实例状态,并将其重建回其对象形式。这遵循不同的过程,然后从头创建一个新的对象。 – iceblueorbitz

+0

啊,那么你可能想要做'self = cls .__ new __()',接着是'super(B,self).__ init __()'(需要任何参数)。如果'B'有自己想要绕过的'__new__'方法,你可能想调用'super(B,cls).__ new __(cls)'而不是'cls .__ new__',但是不应该如果您只需要绕过重写的__init__方法就必须。 – Blckknght

+0

非常感谢,这非常有意义,而且似乎很重要,缺少来自我见过的许多其他帖子和主题的信息。我明白'__new__'经常被人忽视,但在我需要单独的逻辑重新加载JSON字典中的历史记录并重建对象时,它非常有用。 – iceblueorbitz