Spezialfunktion __and__

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
Goswin
User
Beiträge: 363
Registriert: Freitag 8. Dezember 2006, 11:47
Wohnort: Ulm-Böfingen
Kontaktdaten:

Ich benutze Python 3.2.
Warum erhalte ich

Code: Alles auswählen

>>> def __and__(self,other): return min(self,other)
... 
>>> 5 & 9
1
>>> 5 & 3
1
wo ich doch 5&9==5 und 5&3==3 erwarten würde und erhalten möchte?
Was verstehe ich hier falsch?
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Weil `int.__and__(5, 9)` aufgerufen wird. Das self ist doch eigentlich ein deutliches Zeichen, dass es sich um eine Methode handelt und nicht um eine Funktion.
Das Leben ist wie ein Tennisball.
Benutzeravatar
snafu
User
Beiträge: 6740
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Nimm doch einfach operator.and_.

Oder willst du tatsächlich einen Methodenaufruf für den Operator implementieren? Dann ist die Verwendung von `__and__()` richtig. Du müsstest in dem Fall von `int` ableiten und die Methode überschreiben. Diese neue Klasse müsste dann als eine Art Wrapper für deine Zahlwerte benutzt werden. Sonst funktioniert es nicht.
Benutzeravatar
Goswin
User
Beiträge: 363
Registriert: Freitag 8. Dezember 2006, 11:47
Wohnort: Ulm-Böfingen
Kontaktdaten:

:) Vielen Dank für eure Hinweise!

In der Tat, folgendes scheint zu funktionieren:

Code: Alles auswählen

class ganz(int):
   def __and__(self,other): return min(self,other)
   def __rand__(self,other): return min(other,self)

a = ganz(5)
print(min(a,5),'=',a&5,'=', 5&a)
print(min(a,7),'=',a&7,'=', 7&a)
Ich nehme an, dass ich um eine Anweisung wie "a=ganz(5)" nicht herumkomme, oder?
Die Verknüpfungen 'max' und 'min' werden so häufig gebraucht, dass es erstaunlich ist, dass keine große Computersprache dafür Operatoren hat...
BlackJack

@Goswin: Was wäre denn durch einen Operator gewonnen? Es gibt doch Funktionen dafür. Das ist auch die Art wie das in der Mathematik geschrieben wird. Ein Operator dafür ist ungewöhnlich.

Und dass Du jetzt ``&`` dafür zweckentfremdest ist verwirrend, denn es gibt diesen Operator für Zahlen bereits mit einer anderen Bedeutung.
Benutzeravatar
Goswin
User
Beiträge: 363
Registriert: Freitag 8. Dezember 2006, 11:47
Wohnort: Ulm-Böfingen
Kontaktdaten:

@BlackJack: :wink: Tja, wenn ich es recht bedenke, sind die Operatoren + und * eigentlich auch überflüssig, Funktionen wie plus() und mul() sollten genügen. Vor allem würde dann die Funktionalität der Klammern so richtig ausgeschöpft, zum totalen Ergötzen aller Lisp-Programmierer...
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Warum sollte man denn mehr Operatoren einführen? min und max werden so selten verwendet, dafür loht es sich einfach nicht. Hinzu kommt noch die Frage: wie sollte der neue Operator aussehen? min und max haben sich in der Mathematik durchgesetzt und sind auf den ersten Blick verständlich. Ein künstlicher Bruch ist hier nicht sinnvoll.

Mit einem binären Operator für min und max kommt noch hinzu, dass das Aufschreiben bei mehr als zwei Werten sehr seltsam aussehen wird (dann lieber eine durch Kommas getrennte Liste) oder, dasss man zusätzlich noch min und max als Funktionen einführen muss. Dann steht man am Ende mit zwei Alternativen da.
Das Leben ist wie ein Tennisball.
Benutzeravatar
snafu
User
Beiträge: 6740
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Goswin hat geschrieben:@BlackJack: :wink: Tja, wenn ich es recht bedenke, sind die Operatoren + und * eigentlich auch überflüssig, Funktionen wie plus() und mul() sollten genügen. Vor allem würde dann die Funktionalität der Klammern so richtig ausgeschöpft, zum totalen Ergötzen aller Lisp-Programmierer...
Es geht hier um Konventionen bzw Wiederverwendung von bereits bekanntem. Da werden 99% aller Programmierer wohl zustimmen, dass es keinen eigenen Operator für min- oder max-Operationen braucht, weil das einfach total ungewöhnlich wäre, zumal eine Doppeldeutigkeit zum bitweisen Und entstehen würde (BlackJack spielte darauf bereits an). Es steht dir aber natürlich frei, deine eigene "Interpretation" zu implementieren. Nur dann fang nicht gleich an, patzig zu werden, wenn die Leute darüber verwundert sind. NIemand sagt, dass man am Besten überhaupt keine Operatoren verwenden sollte. Das hast du jetzt "weitergesponnen", evtl weil dir das mathematische Hintergrundwissen fehlt (was ja generell nicht sooo dramatisch wäre - nicht, dass du diese Aussage auch noch in den falschen Hals bekommst...).
Antworten