2017-09-10 6 views
3

私はPythonsの理解のギャップを埋めるようにしていますproperty()。以下 はproperty()を理解するために、私が出ているコードです:property()が異なる値を返す

class Temperature: 
    def __init__(self, temp = 10): 
     self.set_temp(temp) 

    def to_farenheit(self): 
     return (self._temp * 1.8) + 32 

    def get_temp(self): 
     print "getting temperature value" 
     return self._temp 

    def set_temp(self, temp): 
     print "setting temperature value" 

     if temp < -237: 
      raise ValueError("this shud be above -273") 
     else: 
      self._temp = temp 

    temps = property(get_temp, set_temp) 

私は上記のクラスを実行し、次の操作を行います

>>> t = Temperature() 
setting temperature value 

>>> t.temps 
getting temperature value 
10 

>>> t.temps = 13 

>>> t.temps 
13 
>>> t.get_temp() 
getting temperature value 
10 
>>> 

私がしようとしたときに、上記の見ることができるようにの値をt.temps = 13に設定すると、property()の機能のために私が期待していた機能が呼び出されていません。また、変数の2つの異なる値で終了しますtemp

私は何が欠けていますか?

答えて

8

これは、単にPython 2を使用してサブタイプobjectを忘れてしまったためです。あなたの場合、propertyは旧式のクラスなので単純に機能しません。

より良いあなたはobjectをサブクラス:

class Temperature(object): 
    ... 

あるいはさらに良い:使用のPython 3のPython 3はもう古いスタイルのクラスを持っていないと、それは暗黙のだから、あなたは(object)一部を省略することができます。

ただし、デコレータ構文を使用できるときは、実際にはget_tempまたはset_temp関数を定義しないでください。そして、あなたは間違いなくそれらを直接呼び出すべきではありません。

は、これははるかにニシキヘビのようになります。

class Temperature(object): 
    def __init__(self, temp = 10): 
     self.temps = temp 

    def to_farenheit(self): 
     return (self._temp * 1.8) + 32 

    @property 
    def temps(self): 
     print("getting temperature value") 
     return self._temp 

    @temps.setter 
    def temps(self, temp): 
     print("setting temperature value") 
     if temp < -237: 
      raise ValueError("this shud be above -273") 
     else: 
      self._temp = temp 

例は、Python 2 descriptors for propertiesを活用のPython 3

1

この問題はthe docsからPythonで2

を発生:

クラスのプロパティ([FGET [、FSET [、FDEL [DOC]]]])

戻るA新しいスタイルのクラスのプロパティ属性(オブジェクトから派生したクラス)。

(重点鉱山。)

あなたはobjectから継承してTemperature新しいスタイルのクラスを作る場合、期待どおり、プロパティが動作します。

1

使用new-style classesに動作すること。

class Temperature(object): 
    def __init__(self, temp=10): 
     self.temps = temp 

    def to_farenheit(self): 
     return (self._temp * 1.8) + 32 

    def get_temp(self): 
     print "getting temperature value" 
     return self._temp 

    def set_temp(self, temp): 
     print "setting temperature value" 

     if temp < -237: 
      raise ValueError("this shud be above -273") 
     else: 
      self._temp = temp 

    temps = property(get_temp, set_temp) 

これは「正しい」動作を示します。

In [30]: t = Temperature() 
setting temperature value 

In [31]: t.temps 
getting temperature value 
Out[31]: 10 

In [32]: t.temps = 100 
setting temperature value 

In [33]: t.temps 
getting temperature value 
Out[33]: 100 

In [34]: t.__dict__ 
Out[34]: {'_temp': 100} 
関連する問題