Присущий Python абстрактный базовый класс в Django - PullRequest
0 голосов
/ 06 июля 2018

Я хотел бы сделать универсальный модуль в Python, который использует данные из модели Django, и использовать ввод для документирования интерфейса. Модуль должен быть независимым от модели Джанго. Как это сделать по-питонски?

Я думаю об использовании класса ABC, тогда независимый файл Python должен выглядеть примерно так (shape.py):

from abc import ABC


class Shape(ABC):
    @property
    @abstractmethod
    def height(self) -> float:
         pass

    @property
    @abstractmethod
    def area(self) -> float:
         pass


class VolumeCalculation:
    def __init__(self, shape: Shape) -> None:
        self.shape = shape

    def volume(self) -> float
        return self.shape.area*self.shape.height

Хотя модель django определена в другом файле:

from django.db import models
from shape import Shape


class Box(models.Model, Shape):
    height= models.FloatField('height')
    area = models.FloatField('area')

Когда я делаю это, я получаю следующую ошибку:

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

В качестве альтернативы я могу удалить базовый класс и построить VolumeCalculation с необходимыми параметрами из Shape. Но поскольку реальный объект содержит много параметров, список становится довольно длинным.

1 Ответ

0 голосов
/ 06 июля 2018

Вам не нужно извлекать Box из Shape, чтобы сделать его Shape, вы можете просто зарегистрировать его :

from django.db import models
from shape import Shape


class Box(models.Model):
    height= models.FloatField('height')
    area = models.FloatField('area')

Shape.register(Box)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...