Я пытаюсь реализовать класс модели данных Django, который также является классом интерфейса, с использованием Python 3. Моя причина для этого заключается в том, что я пишу базовый класс для своего коллеги и мне нужно, чтобы он реализовал три метода во всех классах он происходит от моего. Я пытаюсь дать ему упрощенный способ использования функциональности системы, которую я разработал. Но он должен переопределить несколько методов, чтобы предоставить системе достаточно информации для выполнения кода в его унаследованных классах.
Теперь я ошибаюсь, потому что выдает исключения, но я бы хотел, чтобы класс был примерно таким:
from django.db import models
from abc import ABC, abstractmethod
class AlgorithmTemplate(ABC, models.Model):
name = models.CharField(max_length=32)
@abstractmethod
def data_subscriptions(self):
"""
This method returns a list of topics this class will subscribe to using websockets
NOTE: This method MUST be overriden!
:rtype: list
"""
Я понимаю, что мог бы избежать наследования от класса ABC
, но я хотел бы использовать его по причинам, по которым я не буду утомлять вас здесь.
Проблема
После включения класса, подобного приведенному выше, в мой проект и запуска python manage.py makemigrations
я получаю ошибку: TypeError: metaclass conflict: the metaclass of a derived class must be a (non-strict) subclass of the metaclasses of all its bases
. Я искал переполнение стека, но нашел только решения, подобные следующему:
class M_A(type): pass
class M_B(type): pass
class A(metaclass=M_A): pass
class B(metaclass=M_B): pass
class M_C(M_A, M_B): pass
class C:(A, B, metaclass=M_C): pass
Я прочитал следующие сообщения:
Использование ABC, PolymorphicModel, django-models дает конфликт метакласса
python 3: TypeError: конфликт метаклассов: метакласс производного класса должен быть (нестрогим) подклассом метаклассов всех его баз
И я попробовал много вариантов этих решений, но я все еще получаю страшное исключение metaclass
. Помоги мне Оби-Ван Кеноби, ты моя единственная надежда. : -)