Was ist der eigentliche Sinn von Metaklassen?

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
sape
User
Beiträge: 1157
Registriert: Sonntag 3. September 2006, 12:52

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?
Y0Gi
User
Beiträge: 1454
Registriert: Freitag 22. September 2006, 23:05
Wohnort: ja

Metaklassen sind Vorlagen für Klassen, welche wiederum Vorlagen für Objekte sind. Mit Metaklassen kannst du also dynamisch Klassen erzeugen.
Benutzeravatar
mq
User
Beiträge: 124
Registriert: Samstag 1. Januar 2005, 19:14

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
BlackJack

Und wenn Dir keine praktischen Beispiele einfallen, ist das ein gutes Zeichen, dass Du Metaklassen nicht brauchst. Das ist so ein bisschen "Voodoo".
Benutzeravatar
Rebecca
User
Beiträge: 1662
Registriert: Freitag 3. Februar 2006, 12:28
Wohnort: DN, Heimat: HB
Kontaktdaten:

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
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? ;)
Benutzeravatar
mq
User
Beiträge: 124
Registriert: Samstag 1. Januar 2005, 19:14

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).
Benutzeravatar
birkenfeld
Python-Forum Veteran
Beiträge: 1603
Registriert: Montag 20. März 2006, 15:29
Wohnort: Die aufstrebende Universitätsstadt bei München

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.
Zuletzt geändert von birkenfeld am Dienstag 20. Februar 2007, 20:24, insgesamt 1-mal geändert.
Dann lieber noch Vim 7 als Windows 7.

http://pythonic.pocoo.org/
pyStyler
User
Beiträge: 311
Registriert: Montag 12. Juni 2006, 14:24

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.
sape
User
Beiträge: 1157
Registriert: Sonntag 3. September 2006, 12:52

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
Benutzeravatar
birkenfeld
Python-Forum Veteran
Beiträge: 1603
Registriert: Montag 20. März 2006, 15:29
Wohnort: Die aufstrebende Universitätsstadt bei München

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.
Dann lieber noch Vim 7 als Windows 7.

http://pythonic.pocoo.org/
sape
User
Beiträge: 1157
Registriert: Sonntag 3. September 2006, 12:52

@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
Y0Gi
User
Beiträge: 1454
Registriert: Freitag 22. September 2006, 23:05
Wohnort: ja

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
Antworten