为什么在实例化类时不调用父构造函数?

Vor*_*rac 4 python oop class python-2.7

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


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


b = B()
B
Run Code Online (Sandbox Code Playgroud)

在C++中,我本来希望看到A B输出,但在Python中我只是得到了B.我知道我可以super(B, self).__init__()在Python中实现相同的目标,但是因为这显然不是默认的(或者是它 - 我也是语法的新手),我担心安装对象的范例是完全不同的.

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

Dan*_*man 5

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

class B(A):
    def __init__(self):
        print 'B'
        super(B, self).__init__()
Run Code Online (Sandbox Code Playgroud)

需要注意的是,实例属性与Python中的其他所有属性一样,都是动态的.__init__不是构造函数,这是__new__你很少需要干预的.该对象完全由__init__调用时间构造,但由于实例属性是动态的,它们通常由该方法添加,这只是在创建对象时首先调用它.

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

  • @martineau不要*那样做,它从根本上被打破了.在一个继承链中,`self .__ class__`总是指最底层的类:如果你在链中间的`self .__ class__`上调用super,它将引用底部子类的父类,并且将因此陷入无休止的循环. (2认同)

zmo*_*zmo 4

那么Python中的对象是什么

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

它们与类的关系是什么

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

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

要么您不重新定义构造函数,然后所有父类都将启动其构造函数(如默认的 C++ 行为),要么您重新定义构造函数,然后必须显式调用父类的构造函数。

记住Python的禅宗:“显式优于隐式”。这完全适用于此。