如何处理多个不合作的API类并使它们合作?

2024-09-28 17:19:51 发布

您现在位置:Python中文网/ 问答频道 /正文

受@Raymond Hettinger的“Super-considered-Super”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

有没有办法在不合作的课堂上增加合作性?你知道吗


Tags: selfobjectinitdefargspassthiskwargs
1条回答
网友
1楼 · 发布于 2024-09-28 17:19:51

在您链接的博客文章中,他描述了如何使用适配器来实现结果。例如,您可以这样做:

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

相关问题 更多 >