# dekorator
def cache(f):
...
class A():
def __init__(self, cacheSize=0):
self.cacheSize = cacheSize
@cache(maxsize=self.cacheSize) # tohle nejde..hledal jsem vsemozne pristupy
def long_method(self,x):
...
# pouziti
a=A(5)
a.long_method(3)
from functools import wraps
def cache(f):
print "Dekoruji."
@wraps(f)
def decorated_func(self, *args, **kwargs):
print self # tady je možné dělat se self cokoliv
return f(self, *args, **kwargs)
return decorated_func
# orig wrapper, ktery nemuzu menit (c++ binding), pouziva se takto:
@origcache(maxsize=3)
def long_foo(n):
pass
# muj cil: vytvorit @mycache ktery precte self.cacheSize z contextu sve instance?
# a bude pritom volat @origcache
class A():
def __init__(cacheSize):
self.cacheSize = cacheSize
@mycache
def long_foo(n):
pass
def origcache(f,size=3):
def g(*args,**kwds):
#print(*args, **kwds)
print('Calling decorated function',size)
return f(*args, **kwds)
return g
metaCache={}
def cache(f):
def g(*args,**kwds):
try:
return metaCache[(f,args[0])](*args[1:],**kwds)
except KeyError:
print("defining")
newf=origcache(f,size=args[0].s)
metaCache[(f,args[0])]=newf
return newf(*args[1:],**kwds)
else:
return
return g
class A():
def __init__(self):
self.s=5
@cache
def f(x):
return str(x)+"aa"
a=A()
print(a.f(2))
print(a.f(2))