Verwirrende Zeichen
@Sophus: Du verwendest Python2 erbst aber Deine Klasse nicht von »object«. D.h. Rectangle_1 ist eine klassische Klasse, die noch kein property kennt. Der explizite Aufruf von calculate_area in Zeile 38 ist dank der Properties nicht nötig.
Es klappt. Ich musste in der Tat vom object erben.
Was mich auch wundert, ist, dass in der RectAngle_1()-Klasse mehrere Funktion doppelt vorkommt, und Python kein Problem hat. Hängt das damit zusammen, dass die Funktionen hinterher manipuliert werden?
Was mich auch wundert, ist, dass in der RectAngle_1()-Klasse mehrere Funktion doppelt vorkommt, und Python kein Problem hat. Hängt das damit zusammen, dass die Funktionen hinterher manipuliert werden?
-
BlackJack
@Sophus: Ja, das hat damit zu tun das beim überschreiben des Attributs die `setter()`-Methode verwendet wird und das ja bereits die alte Definition gekapselt hat und den Setter dem Property-Objekt hinzufügt.
-
Py19917062
- User
- Beiträge: 113
- Registriert: Freitag 30. Januar 2009, 00:53
- Wohnort: Dortmund
- Kontaktdaten:
Also kann man, das folgendem Beispiel, auch mit decorators lösen? Wie würde das dann aussehen?
(Das Beispiel hab ich aus einem Buch. Das Skript soll einen direkten Zugriff auf das Attribut temp verhindern, damit ein ein Temperaturwert von -273.15° nicht unterschritten wird. Mit den Property-Funktionen setTemp und getTemp soll der Nutzer trotzdem auf den Wert zugreifen können, solange dieser sich im gültigen Bereich befindet.)
(Das Beispiel hab ich aus einem Buch. Das Skript soll einen direkten Zugriff auf das Attribut temp verhindern, damit ein ein Temperaturwert von -273.15° nicht unterschritten wird. Mit den Property-Funktionen setTemp und getTemp soll der Nutzer trotzdem auf den Wert zugreifen können, solange dieser sich im gültigen Bereich befindet.)
Code: Alles auswählen
class Thermometer(object):
def __init__(self):
self.__temp = 20.0
def setTemp(self, temp):
if type(temp) in [type(1), type(1.0)]:
if temp >= -273.15:
self.__temp = float(temp)
def getTemp(self):
return self.__temp
temp = property(fget=getTemp, fset=setTemp)
Verwende _ wenn jemand auf etwas von außen nicht zugreifen soll und nicht __. Nutze Unterstriche für Namen: get_temp statt getTemp. Überhaupt halte dich an PEP 8. Dein Typcheck ist vollkommen kaputt, verwende isinstance oder issubclass. Deine Frage lässt sich mit der Dokumentation beantworten oder durch lesen der vorherigen Beiträge.
Zuletzt geändert von DasIch am Freitag 3. Juni 2016, 13:57, insgesamt 1-mal geändert.
@Py19917062: normalerweise braucht man keine expliziten set- und get-Methoden. Doppelte Unterstriche sind hier auf fehl am Platz. Statt über type zu prüfen, sollte man isinstance verwenden. Sollte die Temperatur außerhalb des Gültigkeitsbereichs sein, sollte es nicht stillschweigend ignoriert werden. Eingerückt wird mit 4 Leerzeichen pro Ebene. Nicht grundlos Abkürzungen verwenden.
Code: Alles auswählen
class Thermometer(object):
def __init__(self):
self._temperature = 20.0
@property
def temperature(self):
return self._temperature
@temperature.setter
def temperature(self, value):
if not isinstance(value, numbers.Real):
raise TypeError()
if value < -273.15:
raise ValueError()
self._temperature = float(value)
-
Py19917062
- User
- Beiträge: 113
- Registriert: Freitag 30. Januar 2009, 00:53
- Wohnort: Dortmund
- Kontaktdaten:
Sorry, hatte nicht gesehen das es auf Seite 2 weiter geht mit der Diskussion. /me hatte ja schon ein sehr gutes Beispiel gegeben.
Wie "gesagt", habe ich den Code aus einem Buch abgetippt und ist simple gestaltet für das Verständnis. Dass der Typcheck nicht sauber ist, hab ich auch gemerkt.
@DasIch, @Sirius3: Danke für die Tipps und die schnelle Antwort.
Wie "gesagt", habe ich den Code aus einem Buch abgetippt und ist simple gestaltet für das Verständnis. Dass der Typcheck nicht sauber ist, hab ich auch gemerkt.
@DasIch, @Sirius3: Danke für die Tipps und die schnelle Antwort.
