6
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 中实现相同的目标,但是由于这显然不是默认设置(或者它是 - 我对语法也是新手),我担心 instatinating 对象的范例完全不同。

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

4

3 回答 3

6

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

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

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

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

于 2013-06-12T10:33:21.467 回答
4

那么Python中的对象是什么

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

他们与阶级有什么关系

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

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

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

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

于 2013-06-12T10:39:04.680 回答
3

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

class B(A):
    def __init__(self):
        A.__init__(self)
        # super(B, self).__init__() you can use this line as well
        print 'B'
于 2013-06-12T10:27:42.967 回答