为什么在python中双__init__?

ire*_*ana 3 python oop inheritance super

我正在调查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)
Run Code Online (Sandbox Code Playgroud)

thi*_*dam 5

这是Python中类继承的一个例子.您已将BankAccountClass 继承到MinimumBalanceAccountClass.但是,通过__init__MinimumBalanceAccount类中引入函数,您可以重写Class的__init__函数BankAccount.基类可能会初始化您需要的一些变量.因此,它在Child类的__init__构造函数中被调用以确保它.

您可以使用super类来实现相同的行为.在Python 2.x中,等价物将是

class MinimumBalanceAccount(BankAccount):
    def __init__(self, minimum_balance):
        self.minimum_balance = minimum_balance
        super(MinimumBalanceAccount, self).__init__()
Run Code Online (Sandbox Code Playgroud)

或者在Python 3.x中,

class MinimumBalanceAccount(BankAccount):
    def __init__(self, minimum_balance):
        super().__init__()
Run Code Online (Sandbox Code Playgroud)

但是,您必须明白,这将只运行__init__它从基本方法中找到的任何方法.因此,就多重继承而言__init__,如果super未在基类中实现,则很难调用各种其他类的方法.因此,请避免不惜一切代价使用多重继承,或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
Run Code Online (Sandbox Code Playgroud)

如果您仍希望进行多重继承,最好使用该ParentClass.__init__方法或在所有基类中添加super方法调用__init__.