Метод в property

241 просмотра
0
0 Комментариев

Часто вижу что методы у моделей превращают в property. Иногда это делают через декоратор @property, а иногда через property(method_name).

Зачем? Ведь из шаблонов они все равно вызываются без ().


Добавить комментарий

1 Ответы

Python Опубликовано 10.12.2018
0

Вероятно, что бы можно было работать с моделью через свойства не только в шаблонах, но и, например, во view’ах.

Кроме того декоратор @property позволяет визуально отделить свойства от методов.

В упрощенном виде декоратор @property представляет из себя примерно следующий дескриптор:

class property(object):
 
    def __init__(self, fget):
        self.fget = fget
 
    def __get__(self, obj, type = None):
        return self.fget(obj)

Соответственно, если у нас есть класс:

class Foo(object):
 
    def bar(self):
        return 'test1';
 
    @property
    def baz(self):
        return 'test2';

То, с точки зрения внутренней архитектуры питона, вызовы метода bar() свойства baz будут выглядеть так:

obj = Foo()
 
# это выражение полностью эквивалентно: obj.bar()
Foo.__dict__['bar'](obj)
 
# а это полностью эквивалентно: obj.baz
Foo.__dict__['baz'].__get__(obj)

Т.о. оврехэд при использовании свойств у нас будет: 1 дополнительный вызов метода __get__(). Т.е. почти никакого.

Добавить комментарий
Напишите свой ответ на данный вопрос.
Scroll Up