У меня есть класс, который реализует виртуальные атрибуты с помощью __getattr__
. Атрибуты могут быть дорогими, например. выполняя запрос. Теперь я использую библиотеку, которая проверяет, есть ли у моего объекта атрибут, прежде чем он его получит.Как предотвратить hasattr от получения самого значения атрибута
Как следствие, запрос выполняется два раза вместо одного. Конечно, имеет смысл фактически выполнить __getattr__
, чтобы действительно знать, существует ли атрибут.
class C(object):
def __getattr__(self, name):
print "I was accessed"
return 'ok'
c = C()
hasattr(c, 'hello')
Есть ли способ предотвратить это?
Если Python поддерживается __hasattr__
, тогда я мог бы просто проверить, существует ли запрос, он против этого.
Я могу создать кэш, но он тяжелый, так как запрос может иметь параметры. Конечно, сервер может кэшировать сами запросы и минимизировать проблему, но он по-прежнему тяжелый, если запросы возвращают большое количество данных.
Любые идеи?
Если я правильно понимаю ситуацию, вам нужно кэшировать только на основе 'name', поэтому это может быть просто словарь. Кстати, почему вы хотите сделать его похожим на атрибут? – bereal
Что вы хотите, если объект не поддерживает запрос? – Shashank
'hasattr' не является легким тестом для атрибута; он вызывает 'getattr' по существу как' try: getattr ('name'); кроме AttributeError: return False; else: return True'. – chepner