Модель Django, которая подклассов abc, дает конфликт метакласса
У меня есть следующая модель и абстрактный базовый класс
import abc
from django.db import models
class AbstractBase():
__metaclass__ = abc.ABCMeta
@abc.abstractmethod
def my_method(self):
return
class MyModel(models.Model, AbstractBase):
@abc.abstractmethod
def my_method(self):
return 1
Но я получаю следующую ошибку.
конфликт метаклассов: метакласс производного класса должен быть (нестрогим) подклассом метаклассов всех его баз
Я думаю, что проблема здесь (как описано здесь http://code.activestate.com/recipes/204197-solving-the-metaclass-conflict/) в том, что два базовых класса имеют два разных метакласса, поэтому python не может решить, какой метакласс использовать для дочернего объекта.
Чтобы решить эту проблему, я удалил множественное наследование и использовал следующий метод register для регистрации дочернего класса
abc.register(Child)
Но мне не очень понравился этот подход, так как он выглядит как исправление обезьян.
Есть ли другой способ решить эту проблему?
Я пытаюсь явно назначить метакласс Model для Child, но это не сработало. Я не ищу способ решить это путем написания кода. Я думаю, что это должно быть решено путем изменения структуры моего класса.
1 ответ
Помимо создания нового метакласса, который наследует от обоих ABCMeta
а также ModelBase
, или делая там не так много, вы можете сделатьABCMeta
наследовать от ModelBase
,
Тем не менее, может быть уместен другой шаблон регистрации? Может быть что-то вроде Или декоратор класса? Или петля в нижней части contrib.admin.autodiscover
? .py
файл, который вызывает register
на соответствующих классах (например, for var in globals().values(): if isinstance(var, type) and issubclass(var, AbastractBase): register(var)
)?
Редактировать: D'Oh. Я предположил, что ABCMeta
был примером, а не ABCMeta
, Это то, что я получаю за просмотр Stackru на слишком мало сна.