为什么在 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 的伪装;这里,ChildClass 是 MinimumBalanceAccount
这是 Class 继承 Python 的一个例子。您已经继承了BankAccount
Class到MinimumBalanceAccount
Class。但是,通过在 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.
我正在研究 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 的伪装;这里,ChildClass 是 MinimumBalanceAccount
这是 Class 继承 Python 的一个例子。您已经继承了BankAccount
Class到MinimumBalanceAccount
Class。但是,通过在 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.