Python: erzwinge neue Stilklasse

8

Ich möchte, dass dieser Code "nur funktioniert":

%Vor%

Natürlich ist der einfachste Weg, int(c)/3 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%     
bukzor 11.08.2010, 23:02
quelle

5 Antworten

6

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%     
bukzor 12.08.2010, 02:50
quelle
9

Sie müssen __div__ definieren, wenn c/3 funktionieren soll. Python wird Ihr Objekt nicht zuerst in eine Nummer konvertieren.

    
Ned Batchelder 11.08.2010 23:14
quelle
3
%Vor%     
jchl 20.08.2010 08:24
quelle
0
%Vor%     
Matt Williamson 11.08.2010 23:18
quelle
0
___ 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%     
___
kxr 03.05.2017 22:48
quelle

Tags und Links