2012-04-01 15 views
4
class Silly: 
    @property 
    def silly(self): 
     "This is a silly property" 
     print("You are getting silly") 
     return self._silly 

    @silly.setter 
    def silly(self, value): 
     print("You are making silly {}".format(value)) 
     self._silly = value 

    @silly.deleter 
    def silly(self): 
     print("Whoah, you killed silly!") 
     del self._silly 

s = Silly() 
s.silly = "funny" 
value = s.silly 
del s.silly 

しかし、「あなたはばかげている」、「あなたは馬鹿になっています。理由を知らない。あなたは私を理解してもらえますか?Pythonのプロパティデコレータが期待どおりに動作しない

ありがとうございます!

答えて

15

The property decoratorは、new-style classessee also)とのみ動作します。 Sillyobjectから明示的に拡張して、新しいスタイルのクラスにします。あなたが最も可能性の高い使用することですプロパティを追加する正しい方法を知っているとして

class Silly(object): 
    @property 
    def silly(self): 
     # ... 
    # ... 
+0

クラスシリー - >クラスシリー(オブジェクト)、およびそれが働きました。見逃した。ありがとうございました! – Locke

0

(Pythonの3では、すべてのクラスは、新しいスタイルのクラスである):

@property 
def silly(self): 
    return self._silly 


@silly.setter: 
def silly(self, value): 
    self._silly = value 

をしかし、これは新しいスタイルが必要ですクラスには、チェーンのどこかにclass ParentClass(object):があるはずです。 silly = property(get_silly, set_silly)を使用する同様のオプションにも同じ要件があります。

しかし、そこに別のオプションがあり、それは__getattr____setattr__方法をself._sillyのように、対応するプライベート変数を使用して、上書きすることです。

def __getattr__(self, name): 
    """Called _after_ looking in the normal places for name.""" 

    if name == 'silly': 
     self._silly 
    else: 
     raise AttributeError(name) 


def __setattr__(self, name, value): 
    """Called _before_ looking in the normal places for name.""" 
    if name == 'silly': 
     self.__dict__['_silly'] = value 
    else: 
     self.__dict__[name] = value 

__getattr__がのためにチェックした後と呼ばれる方法をお知らせ他の属性をチェックする前に__setattr__と呼びます。の前に他の属性をチェックします。したがって、前者は受け入れられた属性ではない場合はエラーを発生させることができます。後者は属性を設定する必要があります。 であり、self._silly = value__setattr__とすると、無限再帰が発生します。

ここで旧式のクラスを扱っているので、実際にはdictメソッドを使用してください。baseclass.__setattr__(self, attr, value)docsを参照してください)。あなたが望むならば、同様の__delattr__()も存在します。このコードを使用して

は、あなたが今のようなものを行うことができます。

i_am = Silly() 
i_am.silly = 'No, I'm clever' 
print i_am.silly 
関連する問題