저는 파이썬 데코레이터 (와우, 훌륭한 기능!)에 익숙하지 않고, self
인수가 일종의 혼합되어 있기 때문에 다음 작업을 수행하는 데 어려움이 있습니다. 나는이 프로그램을 실행할 때파이썬 데코레이터 자체가 섞여 있습니다.
#this is the decorator
class cacher(object):
def __init__(self, f):
self.f = f
self.cache = {}
def __call__(self, *args):
fname = self.f.__name__
if (fname not in self.cache):
self.cache[fname] = self.f(self,*args)
else:
print "using cache"
return self.cache[fname]
class Session(p.Session):
def __init__(self, user, passw):
self.pl = p.Session(user, passw)
@cacher
def get_something(self):
print "get_something called with self = %s "% self
return self.pl.get_something()
s = Session(u,p)
s.get_something()
, 내가 얻을 : 나는 self.cache[fname] = self.f(self,*args)
문제 할 라인에 대한
get_something called with self = <__main__.cacher object at 0x020870F0>
Traceback:
...
AttributeError: 'cacher' object has no attribute 'pl'
- 물론, 문제는 self
가 cacher 객체 대신 때문이다 실제로는 pl
속성이없는 Session 인스턴스의 그러나 나는 이것을 해결하는 방법을 찾을 수 없습니다.
솔루션 내가 생각했지만,을 사용할 수 없습니다 - 내가 self
오른쪽 맥락에서 평가 될 수 있도록 데코레이터 클래스 (이 article의 2.1 절에 같은) 대신 값의 함수를 반환하고 생각 , 그러나 그것은 내 decorator가 클래스로 구현되고 build-in __call__
메서드를 사용하기 때문에 불가능합니다. 그렇다면 나는 이 아니라이 내 장식자를위한 클래스를 사용하여 __call__method를 필요로하지 않는다고 생각했지만 데코레이터 호출간에 상태를 유지해야하기 때문에 할 수 없다. self.cache
속성).
질문 - 그래서, 떨어져 글로벌 cache
사전 변수 (I 시도,하지만 작동합니다 생각하지 않았다)이 장식 작업을 할 다른 방법이를 사용?
편집 :이 SO 질문은 Decorating python class methods, how do I pass the instance to the decorator?
이렇게하면 '세션'의 모든 인스턴스가 동일한 캐시를 공유한다는 것을 알고 계십니까? –
예, 아직 코드를 완성하지는 않았지만 별도의 캐시를 유지하기 위해 어딘가에 여분의 세션 인수가 있다고 생각했습니다. – Rabarberski