为什么不将__init__分配给超类的__init__?

时间:2012-05-23 22:10:46

标签: python

为什么我在Python代码中没有看到以下内容?

class A:
    def __init__(self, ...):
        # something important

class B(A):
    __init__ = A.__init__

它似乎可以在我的盒子上使用Python 2.5,2.6,2.7和PyPy 1.8。

我看到以下内容,而不是:

class B(A):
    def __init__(self, *args, **kwargs):
        A.__init__(self, *args, **kwargs)

或使用super的内容。

我更喜欢我的第一个例子(明确比隐含更好!)但我担心它不是出于某种原因而是犹太人。它有什么不对或有什么不对吗?

编辑:是的,我的意思是A.__init__,而不是self.__init__

1 个答案:

答案 0 :(得分:10)

当然,它会起作用(假设你做对了,这不在你的例子中),但是没有理由去做。如果您希望B致电A的{​​{1}},请不要在__init__()上定义__init__(),这将自动发生。毕竟,这就是继承的重点。

您希望为B撰写__init__()的唯一原因是,除了B实例时,您还想做些什么>如何初始化B实例。在这种情况下,除了调用A之外,你还要编写其他代码,因此一个简单的赋值也不适合那里。

如果您想保护A.__init__()的{​​{1}}不被猴子补丁更改为B,我想您可以使用此功能。但这似乎是一个边缘案例。更糟糕的是,这是出乎意料的行为,并公然否认Python的动态性。