Verwirrende Zeichen

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.
Sirius3
User
Beiträge: 18335
Registriert: Sonntag 21. Oktober 2012, 17:20

@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.
Benutzeravatar
Sophus
User
Beiträge: 1109
Registriert: Freitag 25. April 2014, 12:46
Wohnort: Osnabrück

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?
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.)

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)
DasIch
User
Beiträge: 2718
Registriert: Montag 19. Mai 2008, 04:21
Wohnort: Berlin

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.
Sirius3
User
Beiträge: 18335
Registriert: Sonntag 21. Oktober 2012, 17:20

@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.
Antworten