在 Python 中一次混合多个类?

Posted

技术标签:

【中文标题】在 Python 中一次混合多个类?【英文标题】:Mixin multiple classes at once in Python? 【发布时间】:2013-06-14 23:12:28 【问题描述】:

有谁知道我如何让下面的代码工作?

def mixin(TargetClass, *args, **kwargs):
    """*args is a bunch of classes to mixin to the TargetClass"""
    if kwargs.get('name') is None:
        kwargs['name'] = '%s_mixed_with_%s' % (TargetClass.__name__, "".join(map(str, args)))

    class MixedClass(TargetClass, *args):
        pass

    MixedClass.__name__ = kwargs.get('name')
    return MixedClass

# assume for all intents and purposes that Foo, Bar, Baz, Bot, Quux, and Muck are Classes
# Foo should inherit from all of Bar, Baz, Bot, Quux, and Muck
def uber_foo = mixin(Foo, Bar, Baz, Bot, Quux, Muck, name="UberFoo")`

现在 Python 解释器 (2.7.5) 引发以下错误:

TypeError:调用元类库时出错 元类冲突:派生类的元类必须是其所有基类的元类的(非严格)子类

【问题讨论】:

你的一些FooBarBaz等类型有元类吗? (您可以通过检查type(Foo) 并寻找任何不是type 的东西来找出答案。)如果一组mixin 有多个不同的元类,您将收到有关冲突的错误,就像您描述的那样。您可以尝试创建一个组合的元类,但我担心它无法正常工作(许多元类具有很深的魔力,而且它们不太可能在编码时考虑到协作多重继承)。 【参考方案1】:

怎么样:

return type(kwargs.get('name'),(TargetClass,)+args,)

代替:

class MixedClass(TargetClass, *args):
    pass

MixedClass.__name__ = kwargs.get('name')
return MixedClass

当然,您脚本的最后一行可能会引发SyntaxError,因为def whatever = something 无效。那应该是:

UberFoo = mixin(Foo,Bar,Baz,Bot,Quux,Muck,name='UberFoo')

【讨论】:

我的第二个想法。我的第一个问题是为什么不直接创建 class AllMixedIn(Foo, Bar, Baz, Bot, Quux, Muck): pass 然后再创建 class SomeName(AllMixedIn)... 而是 +1 来自我 这成功了。谢谢!还有我对 def ... = 的坏处 - 我在 Python 中一直犯这个错误,因为我在 Groovy 中进行了很多编程,并且在函数、方法和 var 声明之前使用了 def。

以上是关于在 Python 中一次混合多个类?的主要内容,如果未能解决你的问题,请参考以下文章

在 Python 中一次更改多个元素

如何在Python中一次运行多个while循环[重复]

有没有办法在 Swift 中一次将委托分配给同一类的多个对象?

在 python for 循环中一次运行 3 个变量。

为啥我们不能在 PL SQL 中一次获取多个值?

在 Chrome 中一次打开多个链接作为新标签页