如何声明模型实现的抽象类和方法? [复制]

Posted

技术标签:

【中文标题】如何声明模型实现的抽象类和方法? [复制]【英文标题】:How to declare abstract class and methods for model implementation? [duplicate] 【发布时间】:2020-06-25 06:50:16 【问题描述】:

我想知道 Django 中是否有一种方法可以创建一个抽象类,我可以在其中声明一个应该在模型中实现的方法。

通常,在 Python 中,我们这样声明抽象类:

import abc

class MyABC(metaclass=abc.ABCMeta):

    @abc.abstractmethod
    def do_something(self, value):
        raise NotImplementedError

然后像这样实现它:

class MyClass(MyABC):

    def do_something(self, value):
        pass

我用 django 做的是:

import abc
from django.db import models

class MyClass(metaclass=abc.ABCMeta):

    @abc.abstractmethod
    def __str__(self):
        raise NotImplementedError

class MyClass2(models.Model, MyClass):

    def __str__(self):
        pass

但这给了我错误:

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

我不明白我在这里做错了什么。 MyClass2 应该继承自 MyClassmodels.Model

我做错了什么?为什么这是错误的?声明应该在模型中实现的方法的更好方法是什么?

【问题讨论】:

也许,这个链接会帮助你***.com/a/16838663/7320045 【参考方案1】:

对于 django 模型你可以试试这个。

从 django.db 导入模型

class MyClass(models.Model):

   class Meta:
      abstract = True
   def __str__(self):
      raise NotImplementedError

class MyClass2(MyClass):

   def __str__(self):
       pass

请参考this 希望这会有所帮助。

【讨论】:

我读了几次这个页面,但是文档没有提到方法。无论如何,这对我有用。谢谢!也许 Django 文档应该有一个关于如何做到这一点的例子。 @macieyn 基本上文档只是明确了概念,这足以理解。 :-) 也许我的英语没有我想的那么好。非常感谢!

以上是关于如何声明模型实现的抽象类和方法? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

Java中抽象类和接口的区别?

抽象类和接口

抽象类和接口的区别

抽象类和接口的对比

抽象类和接口的区别

抽象类和接口的区别