【问题标题】:Child Class constructor using super() - getting unbound method __init__()使用 super() 的子类构造函数 - 获取未绑定的方法 __init__()
【发布时间】:2017-08-01 05:47:36
【问题描述】:

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

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

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)

【问题讨论】:

  • 很高兴您在遇到新问题后接受了我提出的新问题的建议。我知道你会做到的;),对于这个问题是一个加分项,如果我不能及时回答,对不起

标签: python-2.7 constructor superclass class-method


【解决方案1】:

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

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

但您实际上也不需要这样做。您可以调用 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

【讨论】:

  • 谢谢,这是有道理的,也是我认为的问题所在,但在我的特殊情况下(我正在处理的实际代码),我确实覆盖了 B 类中的基类 init,因此极好的。我正在尝试将此类方法用作备用构造函数,该构造函数仍然是 B 实例,但不遵循 B 的初始化过程。具体来说,它用于加载保存为 JSON 的先前实例状态并将其重建回它的对象形式。这遵循一个不同的过程,然后从头开始创建一个新对象。
  • 啊,那么你可能想做self = cls.__new__(),然后是super(B, self).__init__()(使用任何必要的参数)。如果B 有它自己的__new__ 方法你想绕过,你想调用super(B, cls).__new__(cls) 而不仅仅是cls.__new__,但如果你只需要绕过一个被覆盖的__init__ 方法。
  • 非常感谢,这很有道理,而且似乎是我见过的许多其他帖子和主题中缺失的重要信息。我知道 'new' 经常不受欢迎,但在我需要单独的逻辑来从 JSON dict 重新加载历史记录并重建对象的情况下效果很好。
  • @iceblueorbitz 我真的很高兴你终于找到了你的答案,对不起,我回答得太晚了,但我试图做类似的事情,但我不知道 python 中的所有酷东西2.7. Blccngth你的答案是炉排!如果可以的话,那就是加百:)
猜你喜欢
  • 2015-12-06
  • 1970-01-01
  • 2021-01-17
  • 2014-02-17
  • 1970-01-01
  • 2017-09-04
  • 1970-01-01
  • 1970-01-01
  • 2018-03-17
相关资源
最近更新 更多