Seite 1 von 1

Was ist der eigentliche Sinn von Metaklassen?

Verfasst: Dienstag 20. Februar 2007, 19:31
von sape
Damit der andere Thread nicht OT wird, führe ich das hier weiter.
birkenfeld hat geschrieben:
sape hat geschrieben:Ich habe das ganze wirkliche Prinzip von Meta Klassen nicht begriffen oder besser gesagt, ich erkenne nicht den Sinn dahinter wofür man sowas benötigt :-[
Wenn man das Objektmodell von Python betrachtet -- alles ist ein Objekt -- dann müssen eben auch Klassen Instanzen einer Klasse sein. Das ist die Metaklasse.
Ja von ``type`` oder so? Aber das sagt mir aber dennoch nichts über den Sinn. Auch verstehe ich nicht so recht was EnTe da will?

Ok, ich kann per MK zum Beispiel Klassen registrieren wie im Wiki beschreiben, oder dynamisch Methoden anderen Klasse zuweisen. Die dynamische Zuweisung von Methoden lässt sich sicherlich auch ohne MK lösen.

Aber was genau ist der Grundsinn eine Metaklasse? Wozu wurden sie ursprünglich konzipiert und wie kann man das Konzept einer MK in der Praxis wirklich Sinnvoll nutzen?

Verfasst: Dienstag 20. Februar 2007, 19:53
von Y0Gi
Metaklassen sind Vorlagen für Klassen, welche wiederum Vorlagen für Objekte sind. Mit Metaklassen kannst du also dynamisch Klassen erzeugen.

Verfasst: Dienstag 20. Februar 2007, 19:59
von mq
Grundsaetzlich gilt bei Metaklassen: Wenn du nicht weisst, wozu du sie brauchen koenntest, brauchst du sie auch nicht (ging mir frueher auch so).

Ich wuerde mir einfach mal angucken, wie andere Leute Metaklassen in ihrem Code verwenden. SQLAlchemy verwendet die z.B., und Pocoo hat auch ein paar.

Wofuer sie urspruenglich konzipiert wurden, weiss ich nicht. Ich halte sie allerdings fuer eine logische Folge aus Pythons Objektsystem - wenn alles ein Objekt ist, sind auch Klassen Objekte. Wenn Klassen Objekte sind, muss es Klassen geben, die Klassen definieren. Okay, das ist kein Grund, sie in der Form zu implementieren, wie sie implementiert sind, aber es ist eine logische Herleitung :D

Verfasst: Dienstag 20. Februar 2007, 20:02
von BlackJack
Und wenn Dir keine praktischen Beispiele einfallen, ist das ein gutes Zeichen, dass Du Metaklassen nicht brauchst. Das ist so ein bisschen "Voodoo".

Verfasst: Dienstag 20. Februar 2007, 20:07
von Rebecca
lumax hat geschrieben:Ich halte sie allerdings fuer eine logische Folge aus Pythons Objektsystem - wenn alles ein Objekt ist, sind auch Klassen Objekte. Wenn Klassen Objekte sind, muss es Klassen geben, die Klassen definieren.
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

Verfasst: Dienstag 20. Februar 2007, 20:12
von lunar
BlackJack hat geschrieben:Und wenn Dir keine praktischen Beispiele einfallen, ist das ein gutes Zeichen, dass Du Metaklassen nicht brauchst. Das ist so ein bisschen "Voodoo".
Als quasi der erste Schritt zu obfuscated python, oder wie? ;)

Verfasst: Dienstag 20. Februar 2007, 20:17
von mq
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
Sind sie auch. Aber Metaklassen unterscheiden sich in der Hinsicht nicht von normalen Klassen - Metaklassen sind auch Instanzen von Metaklassen. type ist eine Instanz von sich selbst (und nebenbei Erben alle Klassen von object - auch type. object ist aber auch eine Instanz von type. Damit ist type nicht nur eine Instanz von sich selbst, sondern erbt auch von einer anderen Instanz von sich selbst).

Verfasst: Dienstag 20. Februar 2007, 20:19
von birkenfeld
Y0Gi hat geschrieben:Metaklassen sind Vorlagen für Klassen, welche wiederum Vorlagen für Objekte sind. Mit Metaklassen kannst du also dynamisch Klassen erzeugen.
Das ist so nicht richtig:
* Ein "Objekt" ist in Python alles, also sowohl die Instanz, die Klasse als auch die Metaklasse.
* "dynamisch erzeugen" ist irreführend, was meinst du damit?
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.
lunar hat geschrieben: Als quasi der erste Schritt zu obfuscated python, oder wie?
Nein, aber wenn man sie nicht kennt, schaut der Code natürlich komisch aus.

Verfasst: Dienstag 20. Februar 2007, 20:22
von pyStyler
ich zitiere

Eine Metaklasse ist ein Muster nach dem Klassen erzeugt werden. Wenn
man sich eine Klasse als Bauplan für Objekte vorstellt, dann ist eine Metklasse ein Bauplan für Baupläne.

Verfasst: Dienstag 20. Februar 2007, 21:05
von sape
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?
lumax hat geschrieben:Ich wuerde mir einfach mal angucken, wie andere Leute Metaklassen in ihrem Code verwenden. SQLAlchemy verwendet die z.B., und Pocoo hat auch ein paar.
Das habe ich auch mal gemacht, aber verstehen tue ich nicht warum z.B. Pygements Metaklassen für die Lexer nutzt.
BlackJack hat geschrieben:Und wenn Dir keine praktischen Beispiele einfallen, ist das ein gutes Zeichen, dass Du Metaklassen nicht brauchst. Das ist so ein bisschen "Voodoo".
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.
Rebecca hat geschrieben:
lumax hat geschrieben:Ich halte sie allerdings fuer eine logische Folge aus Pythons Objektsystem - wenn alles ein Objekt ist, sind auch Klassen Objekte. Wenn Klassen Objekte sind, muss es Klassen geben, die Klassen definieren.
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
Schön gesagt Rebecca. Für mich klingt das auch ziemlich paradox :D
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?

Also gibt es keine endgültige Antwort für das warum? -- Habt ihr den vielleicht ein par Beispiele wo und warum ihr Metaklassen genutzt habt? Vielleicht geht mir ja dann ein Licht auf.

lg

Verfasst: Dienstag 20. Februar 2007, 21:20
von birkenfeld
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.

Verfasst: Dienstag 20. Februar 2007, 21:25
von sape
@birkenfeld: Thx. Dein Post hilft mir schon mal ein wenig weiter. Ich werde darüber nachdenken und mal ein par Tests mit MKs machen.

lg

Verfasst: Mittwoch 21. Februar 2007, 11:58
von Y0Gi
birkenfeld: OK, "Objekte" war natürlich eine äußerst ungünstige Wahl :) Und den Teil mit der Dynamik streichen wir vielleicht auch.

Ich empfehle die Lektüre dieses Artikels als Einstieg: Metaclasses: Blueprints of Blueprints