Special methods lookup prozess

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
Benutzeravatar
pillmuncher
User
Beiträge: 1484
Registriert: Samstag 21. März 2009, 22:59
Wohnort: Pfaffenwinkel

@BlackJack: Klassenmethoden müssten dann in der Metaklasse definiert werden. Metaklassenmethoden müssten dann allerdings in Metametaklassen definiert werden...
In specifications, Murphy's Law supersedes Ohm's.
BlackJack

@pillmuncher: Aber genau so funktioniert das doch *jetzt* schon‽ Wenn ich auf einer Klasse zum Beispiel `__repr__()`-Abfrage dann bekomme ich nicht das Attribut von der Klasse, sondern das von deren Metaklasse. Genau das soll man ja angeblich abschaffen können. Sehe ich irgendwie nicht.
Benutzeravatar
pillmuncher
User
Beiträge: 1484
Registriert: Samstag 21. März 2009, 22:59
Wohnort: Pfaffenwinkel

@BlackJack: DasIch schrieb, man könne Python so ändern, dass sich Special Methods ebenso verhalten wie andere Methoden. Du fragtest daraufhin, wie man dann Exemplar- von Klassenmethoden unterscheidne könnte, und meintest vermutlich mit Klassenmethoden "Methoden, die auf dem Exemplar operieren, aber in __class__.__dict__ leben". Das Wort Klassenmethode habe ich als classmethod gelesen, und das ist natürlich was anderes. Die leben zwar auch in __class__.__dict__, werden aber mit der Klasse selbst als erstem Argument aufgerufen. Da erzähle ich dir nichts neues. Wollte man den Special Method Lookup ändern, würde sich da tatsächlich nichts ändern. Die Frage ist allerdings, wozu man classmethod eigentlich braucht, wenn man Metaklassen hat? Momentan kann man Klassen-Attribute auch über Exemplare erreichen, allerdings keine Metaklassen-Attribute.

Änderte man den Lookup-Mechanismus so, dass auch bei Special Methods zuerst im __dict__ des Exemplars und - falls dort nicht vorhanden - in __class__.__dict__ nachgesehen wird, dann wäre das genauso wie bei anderen Attributen auch und man könnte Exemplar- und Klassenmethoden leicht unterscheiden.

Irgendwie ist mir nicht recht klar, über was wir gerade reden. Ist auch schon spät.
In specifications, Murphy's Law supersedes Ohm's.
BlackJack

@pillmuncher: Ich kann dem irgendwie nicht folgen. Irgendwo muss man IMHO immer etwas ”unregelmässiges” machen. Vielleicht gehen wir mal von Methoden weg und reden einfach nur über Attribute. Auf einem Objekt nachschauen und wenn es dort nicht vorhanden ist, auf der Klasse nachschauen, ist das ”normale” Verhalten. Das geht aber bei ”Spezialattributen” nicht. Wenn ich ein `__repr__` vom Exemplar abfrage, bekäme ich die gebundene Methode. Okay. Wenn ich `__repr__` von der Klasse abfrage, bekäme ich die ungebundene Methode. Nicht gut, denn damit bekomme ich ja keine Repräsentation der Klasse, was ja aber haben will wenn ich ``repr(Klasse)`` aufrufe. Also werden Spezialattribute gleich in der Klasse gesucht. Auf dem Exemplar bekomme ich `__repr__` von der Klasse. Okay, die ist ja dazu da ein Exemplar umzuwandeln. Und auf der Klasse bekomme ich das `__repr__` von der Metaklasse. Auch richtig, denn das ist ja geschrieben um die Klasse umzuwandeln. Wie sollte man das anders lösen ohne an anderer Stelle dafür ”komisches Spezialverhalten” einzuführen?
Antworten