【问题标题】:Dynamic multiple inheritance or mixins动态多重继承或混合
【发布时间】:2021-04-02 06:58:38
【问题描述】:

我正在尝试了解如何在我的程序中实现多重继承或 MixIn。

我的想法是我有一个 Car 类,它使用 MixIns 添加来自不同性能增强器(如冷空气进气和增压器)的方法。所以像下面这样的东西虽然我知道这不起作用。

car1 = Car(Turbocharger, ColdAirIntake)
car2 = Car(Supercharger)
car3 = Car(Nitrous)

我找到了这个例子,但不确定这是否是我所想的正确方法。

Dynamically mixin a base class to an instance in Python

【问题讨论】:

  • 与子类化相比,将各种组件类型的实例列表传递给Car.__init__ 可能更合适,例如car1 = Car(Turbocharger(), ColdAirIntake())。如果不知道所有类是如何定义的以及它们是如何组合在一起的,就很难说。

标签: python oop multiple-inheritance mixins


【解决方案1】:

您可以通过动态定义汽车类来创建实例:

def make_car(*bases):
    class dynamic_car(*bases, Car):
        pass
    return dynamic_car()

car1 = make_car(Turbocharger, ColdAirIntake)
car2 = make_car(Supercharger)
car3 = make_car(Nitrous)

【讨论】:

    【解决方案2】:

    不确定我是否完全理解您,但如果您只想了解您提到的内容,请查看以下简单示例:

    class Turbocharger(dict):
        # Define any class attributes.
        def __init__(self):
            # Define any instance attributes here.
            super().__init__()
     
        def __call__(self, *others):
            for other in others:
                # You'd want to check if it's a mixin, isinstance()?
                self.update(other)
    
    
    class Supercharger(dict):
        # Same stuff here.
    

    基本上,这些 mixin 中的每一个都只是使用作为参数传递给 __call__ 的其他 mixin 来“更新”自己。这些类只是添加了一些语法糖。

    【讨论】:

    • 现在,当我在回答完问题后再次阅读该问题时,我对您的预期行为更加困惑。这可能很遥远,但如果它对任何人有帮助,我会把它留在这里。我自己从来没有遇到过我会这样做的情况,但我可能很少看到:D。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-02-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多