Я хотел бы сделать универсальный модуль в 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. Но поскольку реальный объект содержит много параметров, список становится довольно длинным.