Страницы

Поиск по вопросам

пятница, 27 декабря 2019 г.

Python “@property”

#python


Всем привет.

Объясните на пальцах, пожалуйста, механизм создания объекта класса, где содержатся
вычисляемые свойства.

Пусть есть такой класс, в котором некоторые свойства объекта хранятся в БД или где-то
удаленно. 

class Person:
    def __init__(self, name):
        self.name = name

    @property
    def age(self):
        sql_serv = SqlServ() # получаем объект, содержащий соединение и курсор
        sql_serv.cursor.execute("select age from pers_table where name=?", self.name)
        result = sql_serv.cursor.fetchone()
        if result:
            return result[0]
        return None


Заметил, что при создании объекта, его @property - свойства заполняются, даже если
к ним еще не обращались. Правильно ли я понимаю, что в данном случае, запрос с SQL-серверу
будет выполняться 


При создании объекта 

person = Person()
При каждом обращении к нему 

if person.age > 18: print person.age #здесь дважды


Можно ли избежать запроса в пункте 1? 

В пункте 2, можно, в принципе, использовать какой-то кэш.
    


Ответы

Ответ 1



При обращении к @property свойству будет вызывать соответствующая ему функция. Т.е. person.age и person.age() приведут к одному и тому же результату. Поэтому и рекомендуется в свойства небольшие куски кода помещать, а не что-то тяжелое, т.к. свойства кажутся чем-то простым, легким. Будь age функцией, фиг бы написали: if person.age() > 18: print person.age() скорее уж: age = person.age() if age > 18: print age Поэтому, имеет смысл кэшировать такие результаты. Тут уже на ваше усмотрение, например можно завести внутреннюю переменную. Например: ... @property def age(self): if self.__age is None: sql_serv = SqlServ() # получаем объект, содержащий соединение и курсор sql_serv.cursor.execute("select age from pers_table where name=?", self.name) result = sql_serv.cursor.fetchone() if result: self.__age = result[0] return self.__age ...

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

Отправить комментарий