在@Raymond Hettinger的“超级被认为是超级的”blogposttalk的启发下,我成了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

10-05 18:30