为什么超类__init__方法没有自动调用?
问题内容:
为什么Python设计人员决定子类的__init__()
方法不像__init__()
其他某些语言那样自动调用其超类的方法?Pythonic和推荐的习语真的像下面这样吗?
class Superclass(object):
def __init__(self):
print 'Do something'
class Subclass(Superclass):
def __init__(self):
super(Subclass, self).__init__()
print 'Do something else'
问题答案:
Python__init__
与其他语言的 构造函数 之间的关键区别在于,__init__
它 不是 构造函数:它是一个
初始化程序 (实际的 构造函数 (如果有,但是请参阅下文;-)是__new__
并且再次完全不同。虽然 构建
所有超(,毫无疑问,这样做,你继续向下构建“之前”)显然是说你的一部分 构建 一个子类的实例,这显然是不适合的情况下 初始化
,因为在许多用例中,超类的初始化需要被跳过,更改和控制-发生在子类初始化的“中间”,如果发生的话,等等。
基本上,出于完全相同的原因,初始化程序的超类委派在Python中不是自动的,此类委派对于 任何 其他方法也不是自动的-请注意,那些“其他语言”对
任何 其他方法都不会自动进行超类委派其他方法… 只是 针对构造函数(如果适用,则为析构函数),正如我提到的,这 不是
Python的__init__
方法。(的行为__new__
也很特殊,尽管实际上与您的问题没有直接关系,因为它__new__
是一个奇特的构造函数,实际上并不一定需要构造任何东西-
可以很好地返回现有实例,甚至是非实例) …显然Python为您提供了 很多 更多的控制机制的比“其他语言”你心目中,其中 还
包括具有在没有自动代表团__new__
本身- !)。