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:元类冲突:派生类的元类必须是其所有基类的元类的(非严格)子类
unittest 模拟和多重继承:TypeError:元类冲突