2016-10-10 7 views
1

私はセッターを持つプロパティを持つクラスを作成しました。このクラスを使用するには2通りの方法があります。そのため、一部のオブジェクトコンポーネントの値はシナリオによって異なる順序で設定されます(__init__の間に設定したくない)。私はここに独自の集合関数を持つ非財産を含めて、何が働いているのか、何が働いていないのかを示しています。Pythonがプロパティセッターを無視してプロパティゲッターを好む

class Dumbclass(object): 

    def __init__(self): 
    self.name = None 
    self.__priority = None 

    @property 
    def priority(self): 
    return self.__priority 

    @priority.setter 
    def priority(self, p): 
    self.__priority = p 

    def set_name(self, name): 
    self.name = "dumb " + name 

    def all_the_things(self, name, priority=100): 
    self.set_name(name) 
    self.priority(priority) 

    print self.name 
    print self.priority 

次のコマンドを実行すると、TypeError: 'NoneType' object is not callableが返されます。私はpdbを調べて、セッターの代わりにゲッターをself.priority(priority)と呼んでいることがわかりました。

if __name__ == '__main__': 
    d1 = Dumbclass() 
    d1.all_the_things("class 1") 

    d2 = Dumbclass() 
    d2.all_the_things("class 2", 4) 

ここでは何が起こっていますか?

+0

python3でも同様のことが確認されています。答えが何か不思議です。 –

+0

@Travis、代入操作が発生し、OPが代入操作を行っていないときにsetterが呼び出される –

+0

...属性を呼び出す*場合は、なぜあなたは 'property'を使用していますか?通常の方法を使用してください。 – Bakuriu

答えて

2

短い答え:あなたのラインself.priority(priority)

self.priority = priorityへの説明を変更してください:セッターはあなたが属性に何かを割り当てるときにのみ呼ばれます。あなたのコードでは、あなたは割り当て操作をしていません。あなたがより多くを理解したい場合はここで

はいくつかの素晴らしいリファレンスです:

  1. Python descriptors
  2. How does the @property decorator work?
  3. Real Life Example
+0

別のセッターを作成することを迷惑にならない理由の良い例を教えてください。 – kimash

0

あなたが原因として優先順位を扱うしようとするこの問題に直面していますあなたのall_the_thingsメソッドのメソッドこの時点ではすでにプロパティなので、変数のように割り当てられます:

def all_the_things(self, name, priority=100): 
    self.set_name(name) 
    self.priority = priority 
+0

それでは、実際にどのようにセッターメソッドを実際に使用していますか?それとも、いつですか? – kimash

+0

@kimash、私の更新された答えを見てください –

関連する問題