Wie füge ich dynamisch Mixins als Basisklassen hinzu, ohne dass MRO-Fehler auftreten?

Angenommen, ich habe eine KlasseA, B undC.

KlasseA undB sind beide Mixin-Klassen für ClassC.

<code>class A( object ):
    pass
class B( object ):
    pass
class C( object, A, B ):
    pass
</code>

Dies funktioniert nicht, wenn Klasse C instanziiert wird. Ich müsste entfernenobject von der Klasse C, damit es funktioniert. (Sonst bekommst du MRO Probleme).

TypeError: Fehler beim Aufrufen der Metaklassenbasen
Es kann keine konsistente Methodenauflösung erstellt werden
Auftrag (MRO) für Basen B, Objekt, A

Mein Fall ist jedoch etwas komplizierter. In meiner FallklasseC ist einServer woherA undB werden Plugins, die beim Start geladen werden. Diese befinden sich in einem eigenen Ordner.

Ich habe auch eine Klasse namensCfactory. In Cfactory habe ich eine__new__ Methode, mit der ein voll funktionsfähiges Objekt C erstellt wird__new__ Methode ISuche Für Plugins laden Sie sie mit__import__und weisen Sie sie dann zuC.__bases__ += (loadedClassTypeGoesHere, )

Das Folgende ist also eine Möglichkeit: (ziemlich abstrakt gemacht)

<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>

Dies wird wieder nicht funktionieren und wird die MRO-Fehler erneut geben:

TypeError: Es kann keine konsistente Methodenauflösung erstellt werden
Auftrag (MRO) für Basisobjekt, A

Eine einfache Lösung hierfür ist das Entfernen derobject Grundklasse vonA undB. Dies macht sie jedoch zu Objekten alten Stils, die vermieden werden sollten, wenn diese Plugins eigenständig ausgeführt werden (was möglich sein sollte, UnitTest-weise).

Eine weitere einfache Lösung ist das Entfernenobject vonC Dies macht es aber auch zu einer Klasse alten Stils undC.__bases__ wird nicht verfügbar sein, daher kann ich der Basis von keine zusätzlichen Objekte hinzufügenC

Was wäre eine gute architektonische Lösung dafür und wie würden Sie so etwas tun? Im Moment kann ich mit alten Klassen für die Plugins selbst leben. Aber ich benutze sie lieber nicht.

Antworten auf die Frage(3)

Ihre Antwort auf die Frage