sape hat geschrieben:Y0Gi hat geschrieben:Metaklassen sind Vorlagen für Klassen, welche wiederum Vorlagen für Objekte sind. Mit Metaklassen kannst du also dynamisch Klassen erzeugen.
Hmm. Dafür gibt es doch mixins?
Nö. Mixins sind ja nur Klassen, die ich in die Vererbungshierarchie einbeziehen kann. Mit Metaklassen dagegen kontrollierst du, was für ein Objekt "Foo" ist, wenn du "class Foo: ..." schreibst.
Das habe ich auch mal gemacht, aber verstehen tue ich nicht warum z.B. Pygements Metaklassen für die Lexer nutzt.
Damit der RegexLexer die einzelnen Tokentypes effizient abarbeiten kann, muss die Definition derselben aufbereitet werden. Dies muss nur einmal pro Klasse geschehen, also am besten beim Erstellen der Klasse. Daher wird einfach eine Metaklasse hergenommen, deren __new__ überschrieben ist.
Ja Ok, das stimmt schon. Aber vielleicht gibt es da was an dem Konstrukt das vorteilhaft ist und ich das nutzen könnte, da ich mir dadurch vieles einfacher machen könnte. Daher frage ich auch nach dem Sinn dahinter.
Natürlich kann man alles, was man mit Metaklassen machen kann, auch anders machen. Aber man kann auch List Comprehensions ersetzen etc.
birkenfeld hat geschrieben:Rebecca hat geschrieben:
Mmh, nach der Logik sind Metaklassen auch Objekte. Also muss es auch Klassen geben, die die Metaklassen erzeugen. Metametaklassen? Welche natuerlich auch wieder Objekte sind................. RuntimeError: maximum recursion depth exceeded
Ganz recht, Metaklassen sind Objekte. Allerdings ist die Rekursion bei "type" beendet, weil eben die Klasse "type" Instanz ihrer selbst ist.
Hmm, ziemlich abstrakt. Wie kann etwas eine Instanz von sich selbst sein?
Das ist auch etwas kompliziert und so eine Klasse ist in Python-Code nicht reproduzierbar. Allerdings ist es die einzige Möglichkeit, die Grundlage, dass alles ein Objekt ist und jedes Objekt von einem Typ ist, einzuhalten.