Cмысл декоратора property?

class Person:
    first_name = 'First'
    last_name = 'Last'

    @property
    def full_name_1(self):
        return ' '.join([self.first_name, self.last_name])

    def full_name_2(self):
        return ' '.join([self.first_name, self.last_name])


Объясните неучу, чем отличается первый метод от второго?
  • Вопрос задан
  • 28278 просмотров
Решения вопроса 3
zymanch
@zymanch
python/django web-developer
что, вкратце, делает декоратор property:
class property(object):
    def __init__(self, fget):
        self.fget = fget

    def __get__(self, obj, type = None):
        return self.fget(obj)

т.о., property реализован через дескриптор, в котором есть только getter
в случае вашего примера, с точки зрения внутренней архитектуры python, разница будет такова:
obj = Person()
# obj.full_name_2()
Person.__dict__['full_name_2'](obj)
# obj.full_name_1
Person.__dict__['full_name_1'].__get__(obj)

зачем это нужно? для себя я вижу пока что только одну причину - отделить свойства класса от методов, позволив обращаться к "вычисляемым" свойствам не как к функциям, а как к атрибутам
Ответ написан
Комментировать
AtomKrieg
@AtomKrieg
Давай я поищу в Google за тебя
"чем отличается первый метод от второго?"
первый метод нужно вызывать без скобок и он прикидывается обычной переменной-членом класса, хотя внутри может быть спрятана весьма замысловатая логика. Обычный геттер, только более удобный.
Ответ написан
@abcd0x00
>>> class Person:
...     first_name = 'First'
...     last_name = 'Last'
...     
...     @property
...     def full_name_1(self):
...         return ' '.join([self.first_name, self.last_name])
...     
...     def full_name_2(self):
...         return ' '.join([self.first_name, self.last_name])
... 
>>> p = Person()
>>> p.full_name_1
'First Last'
>>> p.full_name_2()
'First Last'
>>> p.full_name_2
<bound method Person.full_name_2 of <__main__.Person object at 0xb739a5ec>>
>>>
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
Используя декоратор property вы не сможете указать short_description для вашего объекта
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы