tengo un siguiente modelo y la clase base abstractaUn modelo de Django que las subclases de un ABC, da un conflicto metaclase
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
Pero estoy consiguiendo el error siguiente.
conflicto metaclase: la metaclase de una clase derivada debe ser una (no estricto) subclase de los metaclases de todas sus bases
Creo que el problema aquí es (como se describe aquí http://code.activestate.com/recipes/204197-solving-the-metaclass-conflict/) que dos clases base tienen dos metaclases diferentes, por lo que python no puede decidir qué metaclase usar para el objeto hijo.
Con el fin de resolver este quité inheritence múltiples y el uso siguiente método de registro para registrar clase hija
abc.register(Child)
Pero realmente no me gusta este enfoque ya que parece que el mono parches.
¿Hay alguna otra forma de resolver este problema?
Intento asignar la metaclase del modelo a Child explícitamente pero no funcionó. No estoy buscando una manera de resolverlo escribiendo código. Creo que esto debe resolverse cambiando mi estructura de clase.
Creo que vas a tener que crear una nueva metaclase que haga las cosas de django y abc, probablemente llamando a sus respectivas metaclases en orden, tal vez usando herencia. – cha0site
No hay nada de hackish en usar el método abs.register: está diseñado exactamente para estos casos. Por cierto, la manera de pensar de Python está hecha, por lo que rara vez deberías necesitar interfaces y tal vez, ¿estás demasiado limitado por la manera en que se hacen las cosas en los lenguajes estáticos? – jsbueno
@jsbueno - Puede que tengas razón, pero necesitaré implementar la funcionalidad de la interfaz de alguna manera. Aquí hay un ejemplo de implantación: https://gist.github.com/1559689. ¿Hay una mejor manera de implementar esta funcionalidad en python? – yilmazhuseyin