Использование декоратора свойств Python в методах

#python #python-3.x #python-decorators

#python #python-3.x #python-декораторы

Вопрос:

Вид разрывается между этим. Это не вопрос о том, как работает свойство, скорее это использование. Я понимаю, что свойство можно использовать для получения, установки, удаления атрибутов. Но мой вопрос в том, можно ли использовать его для действий или методов, когда я знаю, что у метода никогда не будет никаких параметров? Причина для этого — я чувствую, что это более интуитивно понятно

Вот что я имею в виду,

 Class Dancer(object):
    def __init__(self, name):
        self._name = name

    #this would be a typical use case
    @property
    def name(self):
       return self._name

    #is this ok ? 
    @property
    def dance(self):
       print("moves like jagger")
       return self

dancer = Dancer("levine")
print(dancer.name)
dancer.dance    #why not ?

  

Я начал делать это для своего проекта (только для случаев, когда это имело смысл). Но начал получать обратную реакцию за это? Что в этом плохого? Есть мысли, предложения?

PS Я знаю, что такие методы никогда не будут иметь параметров

Комментарии:

1. Doc предлагает создавать методы только для чтения. Ваша функция возвращает атрибуты только для чтения, поэтому я не вижу разницы. Он также используется для этого случая: def size(self): return len(self.data) с @property

2. Да, но размер также является некоторым свойством, а не истинным действием, например, dance :-). Мой вопрос в том, могу ли я также использовать его для действий, а не только для возврата некоторого значения атрибута

3. Я бы этого не сделал. Если бы я увидел dancer.dance.name , мне было бы интересно, где / что, черт возьми, является атрибутом name танцевального объекта? dancer.dance().prance().sleep() это был бы ожидаемый способ увидеть связанные действия.

4. Что вы точно подразумеваете под «действием»? Это не программный термин. Разве это не len(self.data) «действие»? Я в замешательстве.

5. Или вы говорите, что выполняете какие-то манипуляции: def dance(self): self.name = 'next_str' тогда это нарушает определение «только для чтения», поэтому это не рекомендуется.