为什么在 python 中使用双 __init__?

Why dual __init__ in python?

我正在研究 python oop 样式。我好像__init__ 构造方法如下。我以前没见过这种风格。为什么在这个东西中使用双重 __init__ 方法?

ex-

class MinimumBalanceAccount(BankAccount):
    def __init__(self, minimum_balance):
        BankAccount.__init__(self)
        self.minimum_balance = minimum_balance

    def withdraw(self, amount):
        if self.balance - amount < self.minimum_balance:
            print 'Sorry, minimum balance must be maintained.'
        else:
            BankAccount.withdraw(self, amount)

class MinimumBalanceAccount 派生自 class BankAccount。因此,在class'的init函数中,需要调用基class的init,由BankAccount.__init__(self).

完成

这无非是变相调用ParentClass.__init__(),即

super(ChildClass, self).__init__()

首选 Python 样式是显式使用 super,而不是在父名称中硬编码 class。

(在 Python 3.x 中:你可以直接说 super().__init__()

所以这实际上只是 Understanding Python super() with init() methods 的伪装;这里,ChildClassMinimumBalanceAccount

这是 Class 继承 Python 的一个例子。您已经继承了BankAccountClass到MinimumBalanceAccountClass。但是,通过在 MinimumBalanceAccount Class 中引入 __init__ 函数,您已经覆盖了 BankAccount Class 的 __init__ 函数。 base class 可能会初始化一些您需要的变量。因此它在 Child class' __init__ 构造函数中被调用以确保.

您可以使用 super class 来实现相同的行为。 在 Python 2.x 中,等价于

class MinimumBalanceAccount(BankAccount):
    def __init__(self, minimum_balance):
        self.minimum_balance = minimum_balance
        super(MinimumBalanceAccount, self).__init__()

或 Python 3.x,

class MinimumBalanceAccount(BankAccount):
    def __init__(self, minimum_balance):
        super().__init__()

但是,您必须明白,这将 运行 它首先从基本方法中找到的任何 __init__ 方法。所以在多重继承方面,如果 classes 中没有实现 super ,那么调用其他各种 classes 的 __init__ 方法是很困难的。因此,请不惜一切代价避免使用多重继承或在所有 classes.

中实施 super
(eg)

class BankAccount(object):
    def __init__(self):
        # Some action here
        # But no super method called here

class MinimumBalanceAccount(BankAccount, LoanAccount):
    def __init__(self, minimum_value):
        super(MinimumBalanceAccount, self).__init__() # Calls BankAccount.__init__()
        super(MinimumBalanceAccount, self).__init__() # Still calls the same

如果您仍然希望使用多重继承,最好使用 ParentClass.__init__ 方法或将 super 方法调用添加到所有基础 class 中的 __init__ es.