¿Cómo agrego dinámicamente mixins como clases base sin obtener errores de MRO?
Di que tengo una claseA
, B
yC
.
ClaseA
yB
son ambas clases mixtas para la claseC
.
<code>class A( object ): pass class B( object ): pass class C( object, A, B ): pass </code>
Esto no funcionará cuando se cree una instancia de la clase C. Tendría que eliminarobject
de la clase C para que funcione. (De lo contrario tendrás problemas de MRO).
TypeError: error al llamar a las bases de metaclase
No se puede crear una resolución de método consistente
orden (MRO) para las bases B, objeto, A
Sin embargo, mi caso es un poco más complicado. En mi clase de casoC
es unservidor dóndeA
yB
Serán los complementos que se cargan en el inicio. Estos están residiendo en su propia carpeta.
También tengo una clase llamadaCfactory
. En Cfactory tengo un__new__
Método que creará un objeto totalmente funcional C. En el__new__
método yobuscar para plugins, cargarlos usando__import__
, y luego asignarlos aC.__bases__ += (loadedClassTypeGoesHere, )
Así que lo siguiente es una posibilidad: (lo hizo bastante abstracto)
<code>class A( object ): def __init__( self ): pass def printA( self ): print "A" class B( object ): def __init__( self ): pass def printB( self ): print "B" class C( object ): def __init__( self ): pass class Cfactory( object ): def __new__( cls ): C.__bases__ += ( A, ) C.__bases__ += ( B, ) return C() </code>
Esto de nuevo no funcionará, y dará de nuevo los errores de MRO:
TypeError: no se puede crear una resolución de método consistente
orden (MRO) para bases objeto, A
Una solución fácil para esto es eliminar elobject
clase de base deA
yB
. Sin embargo, esto los convertirá en objetos antiguos que deben evitarse cuando estos complementos se ejecutan de forma independiente (lo que debería ser posible, según UnitTest).
Otra solución fácil es eliminarobject
desdeC
pero esto también lo hará una clase de estilo antiguo yC.__bases__
no estará disponible, por lo tanto no puedo agregar objetos adicionales a la base deC
¿Cuál sería una buena solución arquitectónica para esto y cómo harías algo como esto? Por ahora puedo vivir con clases antiguas para los propios plugins. Pero prefiero no usarlos.