scr*_*Dog 14 python init multiple-inheritance super new-style-class
可能重复:
Super可以处理多重继承吗?
Python继承?我有一个类结构(下面),并希望子类调用__init__父双方.这可能是以"超级"方式做的还是只是一个可怕的想法?
class Parent1(object):
def __init__(self):
self.var1 = 1
class Parent2(object):
def _init__(self):
self.var2 = 2
class Child(Parent1, Parent2):
def __init__(self):
## call __init__ of Parent1
## call __init__ of Parent2
## super(Child, self).__init__()
Run Code Online (Sandbox Code Playgroud)
Sve*_*ach 33
这个想法super()是你不必__init__()单独调用两个超类的方法 - super()只要你正确使用它就会照顾它 - 请参阅Raymond Hettinger的"Python的超级()被认为超级!" 作出解释.
也就是说,我经常发现super()构造函数调用的缺点超过了优点.例如,所有构造函数都需要提供一个额外的**kwargs参数,所有类必须协作,非协作外部类需要一个包装器,您必须注意每个构造函数参数名称在所有类中都是唯一的,等等.
因此,我认为通过显式命名要为构造函数调用调用的基类方法更容易:
class Child(Parent1, Parent2):
def __init__(self):
Parent1.__init__(self)
Parent2.__init__(self)
Run Code Online (Sandbox Code Playgroud)
我确实使用super()具有保证原型的函数__getattr__().在这些情况下没有缺点.
Cat*_*lus 22
Invocation via super不会调用所有父项,它调用MRO链中的下一个函数.为了使其正常工作,您需要super在所有__init__s中使用:
class Parent1(object):
def __init__(self):
super(Parent1, self).__init__()
self.var1 = 1
class Parent2(object):
def __init__(self):
super(Parent2, self).__init__()
self.var2 = 2
class Child(Parent1, Parent2):
def __init__(self):
super(Child, self).__init__()
Run Code Online (Sandbox Code Playgroud)
在Python 3中,您可以使用super()而不是super(type, instance).
您可以直接用Parent.__init__(self)以下方式调用它们:
class Parent1(object):
def __init__(self):
self.var1 = 1
class Parent2(object):
def __init__(self):
self.var2 = 2
class Child(Parent1, Parent2):
def __init__(self):
Parent1.__init__(self)
Parent2.__init__(self)
print(self.var1, self.var2)
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
14135 次 |
| 最近记录: |