【问题标题】:Factory function to create a class with an unknown number of mixins用于创建具有未知数量 mixin 的类的工厂函数
【发布时间】:2013-03-12 05:59:30
【问题描述】:

我想做一个函数,从可变数量的所谓 mixin 类中创建一个新类。我的第一反应是使用*args ...

>>> def mixins(*args):
        class Foo(*args):

SyntaxError: invalid syntax

...但没有走多远...因为这不起作用,我尝试了这个,这似乎有效:

>>> def mixins(*args):
        class Foo(args[0]):
            pass
        for arg in args[1:]:
            class Foo(Foo, arg):
                pass
        return Foo

问题

还有其他方法可以解决这个问题吗?

动机

我创建了一个包含许多抽象方法的抽象基类。我有几种类型的子类,每个子类都实现了一些需要的抽象方法,但不是全部。有时我可以通过混合 2 个子类来创建一个工作实例,有时需要更多的时间来实现所有抽象方法。

【问题讨论】:

  • 我的直觉告诉我必须有更好的方法。你能解释一下这样做的动机吗?也许使用类装饰器会更合适。您的问题需要基于继承的解决方案吗?
  • @shx2 我添加了有关问题动机的文字。

标签: python factory mixins


【解决方案1】:

您可以使用type 函数来做到这一点:

def mixins(*args):
    return type('Foo', args, {})

您可能还想确保该类始终继承自 object

def mixins(*args):
    bases = args if object in args else args + (object,)
    return type('Foo', bases, {})

【讨论】:

【解决方案2】:

是的。为什么不呢?

以下是您可以动态创建类对象的方法:

type('a',(object,),{})

这将创建一个类型为 - type 的类对象,它派生自对象基类,其属性是一个空字典。

因此,在您的情况下,调用将是:

type('Foo',args,{})

在这里,args 将包含您想要从其继承 Foo 的所有基类。结果将是一个 clas 对象,您可以使用它从 mixins 返回。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-07-27
    • 1970-01-01
    • 1970-01-01
    • 2018-11-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多