在@Raymond Hettinger的“超级被认为是超级的”blogpost和talk的启发下,我成了Python中合作多重继承的超级粉丝。
然而,并不是每个人都知道python中的这个特性,并且经常必须使用无法修改的代码(第三方等)。这就给游戏带来了许多不合作的玩家,也就是那些不太好调用super
的类。
一个不合作的基类可以放在MRO
的末尾来管理:
class External1(object):
"""Nobody touch this code!"""
def __init__(self, *args, **kwargs):
self.important = "super"
class MyClass(MyCooperativeClass,External1):
pass
如何将此模式扩展到多个类,例如确保调用了所有
__init__(*args,**kwargs)
?class External2(object):
"""Nobody is touching this file!"""
def __init__(self, *args, **kwargs):
self.main_functionality = 5 # Chosen by dice roll, guaranteed to be random
class MyChild(MycooperativeClass, External1, External2):
pass
有没有办法在非合作班上增加合作性?
最佳答案
从你链接的博客文章中,他描述了如何使用适配器来获得结果。例如,您可以这样做:
class Root(object):
def __init__(self, *args, **kwargs):
super().__init__(self)
class Extarnal1Adapter(Root):
def __init__(self, *args, **kwargs):
self.external1 = External1(*args, **kwargs)
self.important = self.external1.important
super().__init__(*args, **kwargs)
class Extarnal2Adapter(Root):
def __init__(self, *args, **kwargs):
self.external2 = External2(*args, **kwargs)
self.main_functionality = self.external2.main_functionality
super().__init__(*args, **kwargs)
class MyChild(MycooperativeClass, External1Adapter, External2Adapter):
pass