将abc子类化的django模型会产生元类冲突

yil*_*yin 13 python django conflict metaclass abc

我有一个以下模型和抽象基类

import abc
from django.db import models


class AbstractBase():
    __metaclass__ = abc.ABCMeta

    @abc.abstractmethod
    def my_method(self):
        return


class MyModel(models.Model, AbstractBase):
    @abc.abstractmethod
    def my_method(self):
        return 1
Run Code Online (Sandbox Code Playgroud)

但是我收到以下错误.

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

我认为这里的问题是(正如这里描述的那样http://code.activestate.com/recipes/204197-solving-the-metaclass-conflict/)两个基类有两个不同的元类,所以python无法决定哪个元类到用于子对象.

为了解决这个问题,我删除了多个继承并使用以下寄存器方法来注册子类

abc.register(Child)
Run Code Online (Sandbox Code Playgroud)

但我真的不喜欢这种方法,因为它看起来像猴子修补.

有没有其他方法可以解决这个问题?

我尝试明确地将模型元类分配给Child,但它不起作用.我不是在寻找通过编写代码来解决它的方法.我认为这必须通过改变我的类结构来解决.

Dav*_*ver 2

ABCMeta除了创建一个继承自和的新元类之外ModelBase或继承ABCMetaModelBase,你无能为力。

但是,不同的注册模式可能是合适的吗?也许类似contrib.admin.autodiscover或者类装饰器?或者文件底部的循环.py调用register适当的类(例如,for var in globals().values(): if isinstance(var, type) and issubclass(var, AbastractBase): register(var))?

编辑:哦。我以为那ABCMeta是一个例子,而不是ABCMeta。这就是我在睡眠不足的情况下浏览 StackOverflow 所得到的结果。

  • 如果你觉得这“让 Python 的 OO 变得很弱”,那么我可能会谦虚地建议你对“强 OO 的要求”的理解与 Python 设计者的理解有很大不同(或者当你想输入“时,你不小心输入了“oo”)静态类型检查”?) (3认同)