灵感来自@Raymond Hettinger 的“ super 被认为是 super ” blogpost和 talk我已经成为 Python 中协作多重继承的忠实拥护者。
然而,并不是每个人都知道 python 中的这一特性,而且通常必须使用无法修改的代码(第 3 方等)。这给游戏带来了许多不合作的玩家,即不能很好地调用 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
关于python - 如何处理多个不合作的 API 类并使它们合作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33876865/