4

为什么我在 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__

4

1 回答 1

10

当然,它会起作用(假设你做对了,这不是你的例子),但没有理由这样做。如果您想B调用A's __init__(),请不要定义__init__()on B,这将自动发生。毕竟,这就是继承的全部意义。

您想要编写__init__()for的唯一原因是,除了初始化实例之外,B您还想在初始化B实例时做一些事情。在这种情况下,除了调用之外,您还需要编写额外的代码,因此简单的赋值也不适合那里。AA.__init__()

我想如果你想保护B'__init__()不被猴子补丁更改为A. 但这似乎是一个边缘案例。更糟糕的是,这是出乎意料的行为,是对 Python 动态特性的公然否认。

于 2012-05-23T22:19:40.563 回答