___ answer3463578 ___
Sie müssen __getattr__
definieren, wenn __getattribute__
funktionieren soll. Python wird Ihr Objekt nicht zuerst in eine Nummer konvertieren.
___ qstnhdr ___ Python: erzwinge neue Stilklasse
___ answer3529275 ___
%Vor%
___ qstntxt ___
Ich möchte, dass dieser Code "nur funktioniert":
%Vor%
Natürlich ist der einfachste Weg, __coerce__
zu schreiben, aber ich möchte eine einfachere Perl-Syntax für eine Konfigurations-Minisprache aktivieren.
Es ist bemerkenswert, dass wenn ich eine "Old-style" -Klasse verwende (nicht vom Objekt erben), kann ich dies ganz einfach tun, indem ich eine __coerce__
-Methode definiere, aber alte Klassen sind veraltet und werden entfernt python3.
Wenn ich dasselbe mit einer neuen Stilklasse mache, bekomme ich diesen Fehler:
%Vor%
Ich glaube, das ist Absicht, aber wie kann ich dann das alte Verhalten coerce
mit einer neuen Stilklasse simulieren? Sie können meine aktuelle Lösung unten finden, aber es ist ziemlich hässlich und langatmig.
Dies ist die relevante Dokumentation: (glaube ich)
Bonuspunkte:
%Vor%
___ tag123oop ___ Objektorientierte Programmierung ist ein Programmierparadigma, das "Objekte" verwendet: Datenstrukturen, die aus Datenfeldern und Methoden zusammen mit ihren Interaktionen bestehen.
___ answer3463596 ___
%Vor%
___ tag123class ___ Eine Vorlage zum Erstellen neuer Objekte, die die allgemeinen Zustände und Verhaltensweisen beschreibt. NICHT MIT CSS-KLASSEN VERWECHSELN. Verwenden Sie stattdessen [css].
___ tag123python ___ Python ist eine dynamische und stark typisierte Programmiersprache, die die Usability betont. Zwei ähnliche, aber größtenteils inkompatible Versionen von Python sind weit verbreitet (2 und 3). Wenn Sie eine versionsspezifische Python-Frage haben, sollten Sie die Tags [python-2.7] oder [python-3.x] zusätzlich zum Tag [python] verwenden. Wenn Sie eine Python-Variante wie jython, pypy, iron-python usw. verwenden, kennzeichnen Sie diese bitte entsprechend.
___ tag123coerce ___ hilf uns dieses Wiki zu bearbeiten
___ antwort43771205 ___
Neue Stilklassen arbeiten schneller und präziser als alte Stilklassen. Also keine teureren pow()
, %code% , %code% fordert irgendwelche billigen Gründe und in einer fragwürdigen Reihenfolge.
Der alte Stil %code% hatte auch das Problem, dass er aufgerufen wurde, auch wenn Sie eine Operator-Methode für einen bestimmten Zweck bereits überladen haben. Und es erfordert die Umwandlung in gleiche Typen und ist auf bestimmte binäre Operationen beschränkt. Denken Sie an all die anderen Methoden und Eigenschaften eines int / float / string - und über pow (). Aufgrund all dieser Einschränkungen fehlt %code% in PY3. Die Fragebeispiele zielen auf eine eher breite Virtualisierung ab.
Bei neuen Style-Klassen ist es nur eine Schleife, um viele "ähnliche" Methoden mit wenig Code bereitzustellen, oder diese Aufrufe an einen virtuellen Handler weiterzuleiten und dann schnell und genau definiert und in korrekter und feinkörniger Weise unterklassierbar zu machen. Das ist keine "Regression in der Python-Sprache".
Allerdings würde ich keine Meta-Klasse verwenden, wie in anderen Antworten gezeigt, nur für eine solche Schleife oder für eine einfache Basisklasse. Das würde eine Nuss mit einem Vorschlaghammer knacken.
Hier ein Beispiel Helfer für die Virtualisierung einer "Variante":
%Vor%
Und hier ein Beispiel für einen Anwendungsfall: An Anaphor! (PY2 und PY3):
%Vor%
Nahtlos geht es auch mit dem 3-Arg-Operator %code% :-):
%Vor%
___ answer3464418 ___
Das funktioniert, und ist nach mehreren Verbesserungen (Requisiten für @jchl) weniger eklatant, aber es scheint immer noch, als ob es unnötig sein sollte, vor allem wenn man bedenkt, dass man es kostenlos mit "alten" Klassen bekommt.
Ich suche immer noch nach einer besseren Antwort. Wenn es keine bessere Methode gibt, scheint mir das eine Regression in der Python-Sprache zu sein.
%Vor%
___