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.