从__init __()调用重写方法是否安全?

时间:2011-07-28 12:18:07

标签: python inheritance constructor

这是this question的后续行动:

Effective Java 2nd Edition,第17项:继承的设计和文档,或者禁止它:

  

为了允许继承,类必须遵守一些限制。构造函数不得直接或间接调用可覆盖的方法。如果违反此规则,将导致程序失败。超类构造函数在子类构造函数之前运行,因此在子类构造函数运行之前将调用子类中的重写方法。如果重写方法依赖于子类构造函数执行的任何初始化,则该方法将不会按预期运行。

由于我们只是要触及Java构造函数的初始化方面,我认为在这个问题中将Java的构造函数与Python的__init__()进行比较是安全的。

我猜是因为在Python我可以灵活地决定何时调用(在这种情况下初始化我当前的类'数据属性之后)我的祖先__init__()与Java super()相比需要成为构造函数调用中的第一个语句,从__init__()调用重写方法可能是安全的吗?

如果我在猜测上述内容时是正确的,那么作为一名祖先类设计师,我不会受到我的子类设计师的左右的影响吗?如果子类设计者在初始化他的数据属性之前调用了我的__init__(),并且我会调用该方法,那么我会导致程序失败!

1 个答案:

答案 0 :(得分:6)

  

我可以安全地从__init__()调用被覆盖的方法吗?

你是。在self被评估之前,__init__()绑定已经发生。

  

祖先类设计师受我的子类设计师左右的支配?

这是普遍正确的,与__init__()或其他任何事情无关。

子类开发人员可以任何。此外,这是Python:他们有你的来源,也可以修改它。

  

如果子类设计者在初始化他的数据属性之前调用了我的__init__(),并且我会调用该方法,那么我会导致程序失败!

正确。这种情况发生的方式是子类设计者选择了一个你已经使用的名称。他们保证,通过选择名称,该计划将失败。