Lösung Metaklasse Konflikte
Ich muss eine Klasse erstellen, die verwendet eine andere Basis-Klasse abhängig von einer Bedingung. Mit einigen Klassen, bekomme ich die berühmt-berüchtigten:
TypeError: metaclass conflict: the metaclass of a derived class must be a (non-strict) subclass of the metaclasses of all its bases
Ein Beispiel ist sqlite3
ist, hier eine kurze Beispiel kann man sogar mit in den interpreter:
>>> import sqlite3
>>> x = type('x', (sqlite3,), {})
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: metaclass conflict: the metaclass of a derived class must be a (non-strict) subclass of the metaclasses of all its bases
sqlite3
ist ein Modul, das nicht "Klasse".- Ich war gerade auf der Suche an diesem und erkannte die gleiche Sache, wenn Sie gepostet, dass.
- Dank agf, du hast Recht! sqlite3.Die Verbindung macht es.
- Möglich, Duplikat der Triple Vererbung verursacht Metaklasse Konflikt... Manchmal
InformationsquelleAutor Yves Dorfsman | 2012-06-30
Schreibe einen Kommentar Antworten abbrechen
Du musst angemeldet sein, um einen Kommentar abzugeben.
Statt mit dem Rezept wie erwähnt von jdi, die Sie direkt verwenden können:
Dein Beispiel mit
sqlite3
ungültig ist, weil es ist ein Modul und keine Klasse ist. Ich habe auch auf dieses Thema.Hier ist Ihr problem: Die Basis-Klasse hat eine Metaklasse, die nicht vom gleichen Typ wie die Unterklasse. Das ist, warum Sie bekommen eine
TypeError
.Habe ich eine variation von das activestate-snippet verwenden noconflict.py. Das snippet muss überarbeitet werden, da es nicht python 3.x-kompatibel. Egal, es soll Ihnen eine Allgemeine Idee.
Problem snippet
Lösung snippet
Den code Rezept richtig löst die Metaklassen für Sie.
class C(metaclass=MyMeta):
syntaxclass C(six.with_metaclass(MyMeta))
zu machen, die es in python 3.x-kompatibel ist, konnte Sie nicht?Verwendung der beschriebenen Muster von @michael, aber mit den beiden Python 2-und 3-Kompatibilität (die Verwendung der
six
Bibliothek):Dies auch passiert, wenn Sie versuchen zu Erben eine Funktion und keine Klasse ist.
ZB.
Soweit ich das verstanden aus den bisherigen Antworten der einzige glaube, wir haben in der Regel von Hand zu tun ist:
Aber können wir automatisieren die letzten beiden Zeilen jetzt durch:
Da wir nicht jede version einsetzen-bestimmte Metaklasse syntax dieser
metaclass_resolver
arbeitet mit Python 2 als auch Python 3.