为什么要在python中使用dual-uniu-init?

2024-06-25 06:12:27 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在研究pythonoop风格。我把__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)

Tags: 方法selfinit风格defamountclassbalance
3条回答

这只不过是伪装地调用ParentClass.__init__(),也就是说

super(ChildClass, self).__init__()

首选的Python样式是显式地使用super,而不是在父类的名称中使用硬代码。在

(在python3.x中:可以说super().__init__()

所以这实际上只是伪装的Understanding Python super() with init() methods;这里,ChildClass最小余额账户

MinimumBalanceAccount派生自类BankAccount。因此,在类的init函数中,它需要调用基类的init,这是由BankAccount.__init__(self)完成的。在

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

您可以使用super类来实现相同的行为。 在python2.x中,等效的

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

或者在python3.x中

^{pr2}$

但是,您必须明白,它只会运行它首先从基方法中找到的__init__方法。因此,就多重继承而言,如果基类中没有实现super,则很难调用其他各种类的__init__方法。所以请避免不惜一切代价使用多重继承,或者在所有类中实现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__方法,或者在所有基类中添加对__init__super方法调用。在

相关问题 更多 >