【问题标题】:Why are parent constructors not called when instantiating a class? [duplicate]为什么实例化类时不调用父构造函数? [复制]
【发布时间】:2013-06-08 09:52:22
【问题描述】:
class A:
    def __init__(self):
        print 'A'


class B(A):
    def __init__(self):
        print 'B'


b = B()
B

在 C++ 中,我本来希望看到 A B 输出,但在 Python 中我只得到 B。我知道我可以在 Python 中使用super(B, self).__init__() 来实现相同的功能,但由于这显然不是默认设置(或者它是 - 我也是语法新手),我担心实例化对象的范式完全是不同的。

那么什么是 Python 中的对象,它们与类的关系是什么?在 Python 中初始化所有父类中的所有数据的标准方法是什么?

【问题讨论】:

  • 请注意,super 仅适用于派生自 object 的新型类。

标签: python class oop python-2.7


【解决方案1】:

Python 很少自动执行任何操作。正如你所说,如果你想调用超类__init__,那么你需要自己做,通常通过调用super

class B(A):
    def __init__(self):
        print 'B'
        super(B, self).__init__()

需要注意的一点是,实例属性与 Python 中的其他所有内容一样,都是动态的。 __init__ 不是构造函数,那是 __new__ 你很少需要干预。该对象在调用__init__ 时已完全构造,但由于实例属性是动态的,因此它们通常由该方法添加,唯一的特殊之处在于它在创建对象后首先被调用。

您当然可以通过任何其他方法创建实例属性,甚至可以从类本身之外通过简单地执行类似myBobj.foo = 'bar' 的操作。

【讨论】:

  • super() 仅适用于新型类,因此您的代码仅在 A 声明为 class A(object): 时才有效。在 OP 的代码中,它只是 class A:。另外,为了避免在子类中硬编码名称,我更喜欢写super(self.__class__, self).__init__(),无论子类的名称是什么,它都可以工作。
  • @martineau 不要永远这样做,它从根本上被破坏了。在继承链中,self.__class__ 总是指向最底层的类:如果你在链的中间对self.__class__ 调用 super,它将指向底层子类的父类,因此会卡在无休止的循环。
  • 好点。那么没有什么好的方法可以避免在super() 调用中使用子类的实际名称吗?
  • @martineau 没有。由于其他原因,在 python 中 super 的使用实际上是有争议的。显式调用父级比使用 super 调用更好。
【解决方案2】:

那么 Python 中的对象是什么

嗯,python 中的对象就像成员和方法的字典。它没有比这更复杂的了。你没有可见性处理(如果你想隐藏一个成员,只是不要在公共文档中谈论它,只有评论)。

它们与类的关系是什么

一个类定义了将实例化该dict/对象的方法/成员骨架。所以你得到了构造函数__init__(),它只是你创建该对象时使用的处理程序。

在 Python 中初始化所有父类中的所有数据的标准方法是什么?

要么不重新定义构造函数,然后所有父类都将启动它们的构造函数(就像默认的 C++ 行为一样),或者你重新定义构造函数,然后必须显式调用父类的构造函数。

记住python的禅宗:“显式胜于隐式”。在这里完全适用。

【讨论】:

    【解决方案3】:

    您需要在继承的类构造函数中调用基础构造函数:

    class B(A):
        def __init__(self):
            A.__init__(self)
            # super(B, self).__init__() you can use this line as well
            print 'B'
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-02-05
      • 2023-03-04
      • 2011-09-07
      • 1970-01-01
      • 2015-04-24
      • 2021-02-18
      • 2014-01-14
      • 1970-01-01
      相关资源
      最近更新 更多