#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 ...
Комментариев нет:
Отправить комментарий