我可以在Python中同时使用ABC和Django抽象类吗



我有一个django抽象类:

class AbstractModel(models.Model):
date_added = models.DateField(auto_now_add=True)
class Meta:
abstract = True

我希望我的具体类(Django Models(将这个抽象类子类化,但我也希望确保我的所有具体类始终使用abc实现非常特定的方法。

我试过这样做:

class AbstractBaseClass(AbstractModel, metaclass=abc.ABCMeta):
@abstractmethod
def important_method(self):
pass
class MyDjangoModel(AbstractBaseClass):
...

我试过了:

class AbstractBaseClass(ABC):
@abstractmethod
def important_method(self):
pass
class MyDjangoModel(AbstractModel, AbstractBaseClass):

两者都不起作用。他们都说:

TypeError: metaclass conflict: the metaclass of a derived class must be a (non-strict) subclass of the metaclasses of all its bases

有没有办法做到这一点,或者这是不可能的?

您非常接近正确的解决方案,请参阅示例:

import abc
from django.db import models

class AbstractModelMeta(abc.ABCMeta, type(models.Model)):
"""AbstractModelMeta used as a metaclass"""

class AbstractBaseClass(models.Model, metaclass=AbstractModelMeta):
date_added = models.DateField(auto_now_add=True)
class Meta:
abstract = True
@abc.abstractmethod
def important_method(self):
pass

class MyDjangoModel(AbstractBaseClass):
first_name = models.CharField(max_length=10)

如果抽象方法没有按预期实现,您将得到一个错误:

>>> from main.models import MyDjangoModel
>>> m = MyDjangoModel()
Traceback (most recent call last):
File "<console>", line 1, in <module>
TypeError: Can't instantiate abstract class MyDjangoModel with abstract methods important_method

最新更新