2016-10-10 4 views
1

Я создал класс, который имеет свойство с установщиком. Существует два разных способа использования этого класса, поэтому значения некоторых компонентов объекта могут быть установлены в другом порядке в зависимости от сценария (т. Е. Я не хочу устанавливать их во время __init__). Я включил не-свойство с его собственной функцией набора здесь, чтобы проиллюстрировать, что есть и не работает.Python игнорирует свойство setter в пользу свойства getter

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, setter вызывается, когда происходит операция присваивания, и OP не выполнял операцию присвоения –

+0

... почему вы используете 'свойство', если вы в конечном итоге * вызываете * атрибут? Просто используйте обычный метод. – 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

Итак, как же на самом деле использовать метод setter? Вернее, когда? – kimash

+0

@kimash, см. Мой обновленный ответ –