【发布时间】:2012-02-02 03:56:07
【问题描述】:
我有以下模型和抽象基类
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,但它不起作用。 我不是在寻找通过编写代码来解决它的方法。我认为这必须通过改变我的班级结构来解决。
【问题讨论】:
-
我认为你将不得不创建一个新的元类来做 django 和 abc 的事情,可能通过按顺序调用它们各自的元类,也许使用继承。
-
使用 abs.register 方法并没有什么不好的地方——它就是为这些情况而设计的。顺便说一句,Python 的思维方式已经完成,所以你很少应该需要接口之类的——也许你太受静态语言的方式限制了?
-
@jsbueno - 你可能是对的,但我需要以某种方式实现接口功能。这是一个示例植入-gist.github.com/1559689。有没有更好的方法来实现这个功能,在 python 中?
标签: python django conflict metaclass abc