2016-12-11 3 views
2

ブログの1つでは、私はPython propertyの作業を理解するために使用している次のコードを持っています。Pythonプロパティの動作を理解する

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:__init__法の下では、なぜself._temperatureを使用して、著者があります。 self.temperatureでなければなりませんか?コントロールはどのように@temperature.setterに行くのですか?

+0

私はPython 3でこれを実行してください、あなたは 'オブジェクト'からあなたのクラスを継承する必要があります。 – Anthon

+1

"コントロールはどのように' @ temperature.setter'に行きますか? " - それはできません。 – user2357112

答えて

2

__init__()self._temperatureを使用するのが正しいかどうかは、時には味の問題です。実際には、実際の値が格納されている属性について知っている3番目の方法があります(settergetterは別です)。あなたがクラスをリファクタリングして属性を変更するとエラーにつながる可能性がありますが、それ自体が間違っているわけではありません。

設定者がすでに値が別の方法で格納されていると仮定している状況があります。ここにはないが、例えばself._temperatureを増やした場合にのみ設定する必要があります。その場合は、属性に直接アクセスする必要があります。 (この状況は、セッター内でhasattr(self, "_temperature")を使用してゲッターと適切な初期化を使用して「記憶」属性の存在をテストすることによって回避することができます)。

コントロールがセッターに移動するポイントはありません。あなたがしなければセッターが使用されます:あなたは常に、直接他の方法のいずれかから(この場合はself._temperateで)「隠し」属性を設定することができます

self.temperature = some_value 

(または直接Celsiusのインスタンスの属性にアクセスします)。これはちょうどその前にアンダースコアが付いたプロパティー名であることに注意してください。それは任意の(フリーの)名前でもかまいません。

関連する問題