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

时间:2013-06-12 10:12:21

标签: python class oop python-2.7

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


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


b = B()
B

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

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

3 个答案:

答案 0 :(得分:5)

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

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

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

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

答案 1 :(得分:3)

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

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

答案 2 :(得分:3)

  

那么Python中的对象是什么

嗯,python中的对象就像成员和方法的字典。它并不比那更复杂。您没有可见性处理(如果您想隐藏成员,只是不要在公共文档中谈论它,只需要注释)。

  

他们与班级的关系

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

  

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

要么你没有重新定义构造函数,那么所有父类都会启动它们的构造函数(比如默认的C ++行为),或者你重新定义了构造函数,然后必须对你的父类的构造函数进行显式调用。 / p>

记住python的禅:“明确比隐含更好”。它完全适用于此。