2016-12-11 4 views
2

Von einem der Blogs habe ich den folgenden Code, den ich verwende, um die Funktionsweise von Python property zu verstehen.Funktionsweise der Python-Eigenschaft

class Celsius: 
    def __init__(self, temperature = 0): 
     self._temperature = temperature 

    def to_fahrenheit(self): 
     return (self.temperature * 1.8) + 32 

    @property 
    def temperature(self): 
     print("Getting value") 
     return self._temperature 

    @temperature.setter 
    def temperature(self, value): 
     if value < -273: 
      raise ValueError("Temperature below -273 is not possible") 
     print("Setting value") 
     self._temperature = value 

Q1: Unter der __init__ Methode, warum ist der Autor self._temperature verwenden. Sollte es nicht self.temperature sein? Wie wird die Steuerung zu @temperature.setter gehen?

+0

Ich hoffe, Sie führen dies unter Python 3, auf Python 2 müssen Sie Ihre Klasse von "Objekt" erben. – Anthon

+1

"Wie wird die Steuerung auf' @ temperature.setter' gehen? " - Es wird nicht. – user2357112

Antwort

2

Ob es richtig ist self._temperature in __init__() zu verwenden ist manchmal eine Frage des Geschmacks. Im Wesentlichen gibt es jetzt eine dritte Methode (abgesehen von setter und), die über das Attribut informiert, dass der tatsächliche Wert gespeichert wird. IMO das ist nicht nett, und könnte zu Fehlern führen, wenn Sie die Klasse umgestalten und das Attribut ändern, aber es ist nicht per se falsch.

Es kann Situationen geben, in denen der Setter bereits davon ausgeht, dass ein Wert auf andere Weise gespeichert wird. Nicht hier, aber z.B. wenn die self._temperature nur gesetzt werden sollte, wenn es erhöht wurde. In diesem Fall müssen Sie direkt auf das Attribut zugreifen. (Diese Situation kann umgangen werden, indem auf die "Speicher" -Attitexten unter Verwendung von hasattr(self, "_temperature") innerhalb des Setter und Getters getestet und entsprechend initialisiert wird).

Es gibt nie einen Punkt, an dem das Steuerelement an den Setter geht. Der Setter verwendet wird, wenn Sie tun:

self.temperature = some_value 

Sie können jederzeit die „versteckte“ Attribut direkt gesetzt (in diesem Fall self._temperate) aus einem der anderen Verfahren (oder den Zugriff auf direkt das Attribut auf einer Instanz von Celsius). Bitte beachten Sie, dass dies zufällig der Name der Eigenschaft ist, mit einem Unterstrich davor, es könnte jeder (freie) Name sein.

Verwandte Themen