繁体   English   中英

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

[英]A django model that subclasses an abc, gives a metaclass conflict

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

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

但是我收到以下错误。

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

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

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

abc.register(Child)

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

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

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

除了建立一个新的元类是来自继承ABCMetaModelBase 或使ABCMeta继承ModelBase 你无能为力。

但是,可能有不同的注册模式可能是合适的吗? 也许像contrib.admin.autodiscover 还是班级装饰师? .py文件底部的循环,它调用相应类的register (例如, for var in globals().values(): if isinstance(var, type) and issubclass(var, AbastractBase): register(var) )?

编辑 :D'哦。 我认为ABCMeta就是一个例子,而不是ABCMeta 这就是我在太少睡眠时浏览StackOverflow所得到的。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM