Seite 2 von 2

Re: Verwirrende Zeichen

Verfasst: Dienstag 31. Mai 2016, 19:03
von Sirius3
@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.

Re: Verwirrende Zeichen

Verfasst: Dienstag 31. Mai 2016, 19:15
von Sophus
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?

Re: Verwirrende Zeichen

Verfasst: Dienstag 31. Mai 2016, 19:21
von 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.

Re: Verwirrende Zeichen

Verfasst: Freitag 3. Juni 2016, 13:45
von Py19917062
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)

Re: Verwirrende Zeichen

Verfasst: Freitag 3. Juni 2016, 13:52
von DasIch
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.

Re: Verwirrende Zeichen

Verfasst: Freitag 3. Juni 2016, 13:54
von Sirius3
@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)

Re: Verwirrende Zeichen

Verfasst: Freitag 3. Juni 2016, 14:18
von Py19917062
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.