TypeError:python中的元类冲突

Posted

技术标签:

【中文标题】TypeError:python中的元类冲突【英文标题】:TypeError: metaclass conflict in python 【发布时间】:2012-07-27 05:56:43 【问题描述】:

我正在使用 django-tastypie 为我的 webapp 创建一个 rest API。 我想创建如下所述的类而不明确输入它们(我有超过 100 个类)

class CityResource(ModelResource):
    class Meta:
        queryset = City.objects.all()
class StateResource(ModelResource):
    class Meta:
        queryset = State.objects.all()
etc...

我正在考虑在 python 中使用元类(我的方法可能是错误的,但仍然想以这种方式解决它,因为我想看看元类如何帮助我,也许是在现实生活中学习它的好方法)

我试过这个:

class ClassFactory(type):
    def __new__(cls, name, bases, dct):
        return type.__new__(cls, name, bases, dct)

for model in get_models(app):
    name = "%sResource" % model._meta.object_name
    ClassFactory(name, (ModelResource, ), 'Meta':type('Meta', (), 'queryset': model.objects.all()))

但这会报错:

TypeError: metaclass conflict: the metaclass of a derived class must be a (non-strict) subclass of the metaclasses of all its bases

我用谷歌搜索了这个,到处都提到如果一个类派生自具有两个不同元类的其他 2 个类,那么我创建的类必须有一个从这两个元类派生的元类[*]。

    在我的情况下,这个错误是如何发生的,因为我是从同一个类 ModelResource 派生的? 我不确定我是否理解 [*]

我可能以错误的方式解决了这个问题,但需要一些指示。

【问题讨论】:

"(我的方法可能是错误的,但仍然想这样解决)"我从来不理解这种态度。如果你的方法是错误的,那就改变它。我在这里没有什么建设性要说的,因为 django 经常让你做一些你通常不需要做的事情,但不要故意放弃一个潜在的更好的方法来做你正在做的事情。是的,100 节课听起来很疯狂。 我的想法是了解元类如何帮助我,这就是我问这个问题的原因。主要学习如何为此编写元类,如果可能的话,还要了解为什么这种方法可能是错误的。这就是态度。我一直认为至少在 SO 上问这样的问题是可以的。 另外,这个问题真的与 django 无关 我认为当您遇到需要使用元类解决的问题时,您应该学习如何使用元类(这种情况极为罕见,著名的 Python 核心开发人员表示,需要的方法不到 1% Python 开发人员)。我并不是说这里没有必要,它可能是,但要记住这一点。至于什么问题适合SO,我不知道,但我希望能帮助你编写好代码的问题成为基准。 我认为你根本不需要ClassFactory“元类”。 type(name, (ModelResource, ), ...) 应该根据需要返回一个派生自 ModelResource 的新类。 【参考方案1】:

(从评论转贴。)

我认为你根本不需要ClassFactory“元类”。

klass = type(name, (ModelResource, ), ...)

应该根据需要为您提供一个派生自 ModelResource 的新类。

【讨论】:

以上是关于TypeError:python中的元类冲突的主要内容,如果未能解决你的问题,请参考以下文章

TypeError:元类冲突:派生类的元类必须是其所有基类的元类的(非严格)子类

Python 元类冲突

unittest 模拟和多重继承:TypeError:元类冲突

为啥我的元类实现失败并出现关于无法创建 NoneType 实例的 TypeError

Django:调用元类库时出错

为啥具有对象基础的元类会引发元类冲突?