我正在研究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)
答案 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