Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/ant/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 元类与单继承冲突_Python_Django_Metaclass - Fatal编程技术网

Python 元类与单继承冲突

Python 元类与单继承冲突,python,django,metaclass,Python,Django,Metaclass,我正在为django admin类创建一个继承子类,如下所示: from django.contrib.auth import admin as auth_admin class UserAdmin(auth_admin.UserAdmin): pass 我得到了一个错误:“元类冲突:派生类的元类必须是其所有基元类的(非严格)子类” 我想我理解这个错误在抱怨什么——但我不清楚为什么我只有一个祖先。每次我看到这个错误,都是因为我使用了多重继承。单一祖先的类元类可能与什么冲突?如果为Use

我正在为django admin类创建一个继承子类,如下所示:

from django.contrib.auth import admin as auth_admin

class UserAdmin(auth_admin.UserAdmin):
   pass
我得到了一个错误:“元类冲突:派生类的元类必须是其所有基元类的(非严格)子类”


我想我理解这个错误在抱怨什么——但我不清楚为什么我只有一个祖先。每次我看到这个错误,都是因为我使用了多重继承。单一祖先的类元类可能与什么冲突?

如果为
UserAdmin
选择了不正确的元类,例如通过
\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu>以某种方式插入到新生类的dict中,则可能会发生。请尝试以下测试:

# force the correct metaclass:
metaclass = type(auth_admin.UserAdmin)
UserAdmin = metaclass("UserAdmin", (auth_admin.UserAdmin,), {})
如果这样做有效,则意味着在
语句中选择的元类不是
类型(auth\u admin.UserAdmin)
。罪魁祸首应该通过grepping Django sources和混入
\uuuuu元类\uuuuu
来发现


如果此操作失败并出现相同的错误,则可能是元类构造函数正在进行自己的类构造,而由于真正的多重继承错误而失败。在这种情况下,堆栈跟踪应该显示发生这种情况的位置。

问题与实际的管理类无关-用于添加表单的表单必须是ModelForm的子类-在这种情况下,它只是一个普通表单。当添加到页面时,django会对表单进行内省,如果它不是ModelForm,则会尝试插入一个类,从而导致元类型不匹配。

但在上述情况下,代码甚至不会调用
add\u form
,并且仍然引发异常?顺便说一句,很高兴问题解决了,请随意接受您的答案,这样问题就不会一直处于未回答状态。add_form是一个属性-我猜admin类的元类会尝试创建表单,因此在定义类时会发生冲突。