integer __add__ Methode überschreiben

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
Sendtex
User
Beiträge: 2
Registriert: Freitag 25. Dezember 2015, 21:17

Hallo

ich versuche die __add__ Methode von der Klasse 'int' so zu überschreiben, dass wenn das Ergebnis über 360 geht, es auf Ergebnis - 360 gesetzt wird.
Nun weiß ich aber nicht welche der Attribute von 'int' ich ansprechen muss. Denn 'numerator' oder 'real' sind nicht setzbar (ich weiß nicht einmal was die genau sind). help(int) hat mir auch nicht geholfen. :|

Code: Alles auswählen

class Grad(int):
	def __add__(self, other):
		...?
DasIch
User
Beiträge: 2718
Registriert: Montag 19. Mai 2008, 04:21
Wohnort: Berlin

Du musst gar keine Attribute ansprechen, verändern kannst du die ohnehin nicht. Für einfach die Addition durch, wenn das Ergebnis passt gib es weiter und wenn es über 360 ist, gib 360 zurück.
Sirius3
User
Beiträge: 17749
Registriert: Sonntag 21. Oktober 2012, 17:20

@Sendtex: Du weißt, dass es neben __add__ noch viele andere spezielle Methoden gibt, die Du auch alle überschreiben mußt, um ein konsistentes Verhalten zu bekommen. Einfacher und lesbarer ist, das explizit zu machen:

Code: Alles auswählen

a = (b + c) % 360
Sendtex
User
Beiträge: 2
Registriert: Freitag 25. Dezember 2015, 21:17

@Sirius3: Danke für die Antwort. Das mit dem % 360 kannte ich noch nicht. Stimmt natürlich, dass es einfacher ist eine ganz neue Klasse zu machen. Mich interessiert aber auch, wie die int Klasse von python funktioniert. Bei python help(int) wird viel von einem 'x' geschrieben. Weißt du was es damit auf sich hat oder hast du einen Link? Übrigens ich benutze python 2.7 falls es da Unterschiede gibt.
DasIch
User
Beiträge: 2718
Registriert: Montag 19. Mai 2008, 04:21
Wohnort: Berlin

Mit x (y oder z) ist in der Dokumentation ein int gemeint, also nicht die Klasse selbst sondern irgendeine Instanz.
Benutzeravatar
snafu
User
Beiträge: 6740
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Naheliegend wäre:

Code: Alles auswählen

class Grad(int):
   def __add__(self, other):
      return (self + other) % 360
Das funktioniert jedoch nicht, weil dann immer wieder die von dir überschriebene Methode erneut aufgerufen wird.

Die richtige Lösung ist, dass man die __add__()-Methode der Elternklasse aufruft:

Code: Alles auswählen

class Grad(int):
   def __add__(self, other):
      return int.__add__(self, other) % 360
Das soll aber wirklich nur zu Übungszwecken dienen. In der Praxis ist das Erben von Builtin-Typen meistens eine ganz schlechte Idee. Wenn du einmal angefangen hast, dann müsstet du auch definierten, was bei Minus, Mal, usw passieren soll. Außerdem gibt dir das obige Beispiel als Ergebnis nicht mehr etwas vom Typ Grad zurück, sondern einen int. Wenn man dies beachtet, dann müsste es so aussehen:

Code: Alles auswählen

class Grad(int):
   def __add__(self, other):
      return Grad(int.__add__(self, other) % 360)
Du siehst: Es ist allein schon für so ein kleines Beispiel recht kompliziert, wenn man konsistente Ergebnisse liefern will.
Antworten