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中所有父类中初始化所有数据的标准方法是什么?
答案 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的禅:“明确比隐含更好”。它完全适用于此。