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

标签 python multiple-inheritance super

灵感来自@Raymond Hettinger 的“ super 被认为是 super ” blogposttalk我已经成为 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/

相关文章:

python - 使用Python和SQLite创建表,没有这样的表

java - Super() 首先要做的事情

java - 在 Java 中同时调用默认构造函数和 super 构造函数

python - 在 if 或 while 语句 python 中打印一次 uniqe 变量

python - 如何停止由于输入错误而运行的代码而不导致 GUI 崩溃

python - Django 管理命令和 argparse

c++ - 使用继承的具体类在 C++ 中实现接口(interface)

java - 一个接口(interface)可以在Java中扩展多个接口(interface)吗?

javascript - Object.create 多个原型(prototype)

python - 属性错误:类型对象 'Ned' 没有属性 'attack' ?