Mam klasę, która implementuje wirtualne atrybuty przy użyciu __getattr__
. Atrybuty mogą być kosztowne, np. wykonanie zapytania. Teraz używam biblioteki, która sprawdza, czy mój obiekt ma atrybut, zanim faktycznie go otrzymam.Jak uniemożliwić hasattr pobieranie samej wartości atrybutu?
W konsekwencji kwerenda jest wykonywana dwa razy zamiast jednego. Oczywiście naprawdę warto wykonać __getattr__
, aby naprawdę wiedzieć, czy atrybut istnieje.
class C(object):
def __getattr__(self, name):
print "I was accessed"
return 'ok'
c = C()
hasattr(c, 'hello')
Czy istnieje sposób, aby temu zapobiec?
Jeśli Python obsługuje __hasattr__
, mógłbym po prostu sprawdzić, czy zapytanie istnieje, czy nie jest w stanie go uruchomić.
Mogę utworzyć pamięć podręczną, ale jest ona ciężka, ponieważ zapytanie może mieć parametry. Oczywiście serwer może samodzielnie buforować zapytania i minimalizować problem, ale nadal jest obciążony, jeśli zapytania zwracają dużą ilość danych.
Wszelkie pomysły?
Jeśli dobrze rozumiem sytuację, należy buforować tylko na podstawie nazwy, aby mógł to być tylko słownik. BTW, dlaczego chcesz, aby wyglądał jak atrybut? – bereal
Co chcesz zrobić, jeśli obiekt nie obsługuje zapytania? – Shashank
'hasattr' nie jest lekkim testem dla atrybutu; nazywa 'getattr' zasadniczo tak jak' try: getattr ('name'); oprócz AttributeError: return False; else: return True'. – chepner