【问题标题】:metaclass conflict with single inheritance元类与单继承冲突
【发布时间】:2012-11-26 17:39:17
【问题描述】:

我正在为 django 管理类做一个单一的继承子类,如下所示:

from django.contrib.auth import admin as auth_admin

class UserAdmin(auth_admin.UserAdmin):
   pass

我收到错误消息:“元类冲突:派生类的元类必须是其所有基类的元类的(非严格)子类”

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

【问题讨论】:

    标签: python django metaclass


    【解决方案1】:

    如果为 UserAdmin 选择了不正确的元类,例如 __metaclass__ 以某种方式插入到新生类的字典中,则可能会发生这种情况。试试下面的测试:

    # force the correct metaclass:
    metaclass = type(auth_admin.UserAdmin)
    UserAdmin = metaclass("UserAdmin", (auth_admin.UserAdmin,), {})
    

    如果这可行,则意味着在您的class 语句中选择了type(auth_admin.UserAdmin) 以外的元类。应该通过对__metaclass__ 的 Django 源和 mixin 进行 grepping 来揭示罪魁祸首。

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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

      • 但在上述情况下,代码甚至没有调用add_form,仍然引发异常?顺便说一句,很高兴问题得到解决 - 请随时接受您的回答,这样问题就不会一直处于未回答状态。
      • add_form 是一个属性 - 我猜管理类的元类试图创建表单,所以在定义类时会发生冲突。
      猜你喜欢
      • 2015-04-27
      • 2012-06-30
      • 1970-01-01
      • 1970-01-01
      • 2011-09-27
      • 2011-11-20
      • 2021-10-30
      • 1970-01-01
      相关资源
      最近更新 更多