Seite 1 von 1

Frage zu new-style Klassen

Verfasst: Freitag 14. Mai 2004, 16:44
von Mars
Hallo, ich bin auf der Suche nach einem Pythonforum auf diese Seite gestoßen; das hier ist mein erster Post. Zuvor konnte ich meine Probleme meist mit der offiziellen Dokumentation lösen, jetzt hänge ich aber ein wenig fest.

Um meinen Code ein wenig zu vereinfachen, möchte ich die in Python 2.2 eingeführten neuen Klassen ausnutzen, und zwar indem ich vom Basistyp float ableite. Ich habe hier mal ein kleines Beispiel für die Sache, die ich machen will, verfasst:

Code: Alles auswählen

>>> class Test(float):
...     def add5(self):
...         self = self+5
...     
>>> a = Test(10)
>>> print a
10.0
>>> a.add5()
>>> print a 
10.0
Wie ihr seht, möchte ich in einer Methode der Klasse einer Instanz einen neuen Wert zuweisen. Das funktioniert aber auf die einfache Weise, wie ich mir das erhofft habe, nicht. Wüsste jemand, wie man das zum Laufen bekäme?

Verfasst: Freitag 14. Mai 2004, 17:13
von Milan
Hi. In Python sind String, Int, Long und Float eben immutable Objects, dass heißt sie können nicht verändert werden, wenn sie einmal erstellt wurden. Du kannst nur wiederum eine neue Zahl zurückgeben lassen, aber die "alte" Zahl an sich wirst du niemals ändern können. Jedenfalls wüsste ich auf Anhieb keine Möglichkeit das zu tun. Natürlich kannst du das mit einem einfachen Trick nur vorgaukeln, indem du klassenintern ein float speicherst und den dann entsprechend neu setzt. Nur dann kannst du es dir auch sparen von float abzuleiten... also nicht nicht so direkt umsetzbar :roll: . Da möchte ich mich aber nicht 100% festlegen, da ich noch nie mit super und Metaklassen etc gearbeitet habe und nicht weiß, was diese noch an extra Funktionalität bringen. Nur glaube ich trotzdem nichts dran - immutable ist immutable.

Verfasst: Freitag 14. Mai 2004, 17:19
von Dookie
Hi Mars,

floats sind immutable, also unveränderlich.
Beispiel:

Code: Alles auswählen

>>> a = 3.0
>>> b = a
>>> a += 2.5
>>> print a
5.5
>>> print b
3.0
>>>
Wie du siehst bleibt b unverändert, a wird bei a += 2.5 eine neue Instanz der Klasse float zugewiesen.
Diese unveränderlichkeit wird auch an abgeleitete Klassen weitervererbt.
Du wirst also nicht drumrum kommen eine eigene Klasse mit allen nötigen Rechenoperationen und einem Attribut das den Wert enthält zu erstellen.


Gruß

Dookie

Verfasst: Freitag 14. Mai 2004, 17:23
von Mars
Milan hat geschrieben:Natürlich kannst du das mit einem einfachen Trick nur vorgaukeln, indem du klassenintern ein float speicherst und den dann entsprechend neu setzt. Nur dann kannst du es dir auch sparen von float abzuleiten...
Hmm, genau dass mache ich ja im Moment. Aber dass float immutable ist, hätte ich auch bedenken sollen. Irgendwie sinkt die Nützlichkeit von numerischen Typen abzuleiten dadurch ganz beträchtlich.
also nicht nicht so direkt umsetzbar :roll: . Da möchte ich mich aber nicht 100% festlegen, da ich noch nie mit super und Metaklassen etc gearbeitet habe und nicht weiß, was diese noch an extra Funktionalität bringen. Nur glaube ich trotzdem nichts dran - immutable ist immutable.
So wird's wohl sein.

Außerhalb von solchen Klassenspielereien fällt einem dass bei Floats gar nicht auf, da f = f + 5 funktioniert, wie man sich's denkt, man am Ende aber ein ganz anderes Objekt bekommt, das eben nur an den alten Namen gebunden wird...

Danke jedenfalls für die flotte Hilfe!