为什么在python中双__init__?

时间:2015-02-16 15:12:05

标签: python oop inheritance super

我正在研究python oop风格。我似乎__init__构造方法如下。我之前没有看到过这种风格。为什么在这个东西中使用双__init__方法?

前 -

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)

3 个答案:

答案 0 :(得分:5)

这是Python中类继承的一个示例。您已将BankAccount类继承到MinimumBalanceAccount类。但是,通过在__init__类中引入MinimumBalanceAccount函数,您已覆盖__init__类的BankAccount函数。基类可能会初始化您需要的一些变量。因此它在Child class&#39; __init__构造函数,以确保。

您可以使用super类来实现相同的行为。 在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__方法。因此,就多重继承而言,如果基类中没有实现__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

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

答案 1 :(得分:1)

班级MinimumBalanceAccount来自班级BankAccount。因此,在课堂上#39; init函数,它需要调用基类的init,这由BankAccount.__init__(self)完成。

答案 2 :(得分:1)

这只不过是伪装成ParentClass.__init__(),即

super(ChildClass, self).__init__()

首选的Python样式是在父类的名称中显式使用super而不是hardcode。

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

所以伪装真的只是Understanding Python super() with init() methods;在这里, ChildClass MinimumBalanceAccount