1
raptium 2014-07-01 20:22:02 +08:00 via Android 1
decorator
|
2
SakuraSa OP 这个修饰器该如何写呢?
修饰器返回的函数应该是怎样的参数形式呢? 我想参照@property、@classmethod、@staticmethod的源码,但是鉴于水平,看不懂…… 如果能有一个小例子的话,就万分感谢了。 |
3
jianghu52 2014-07-01 20:36:56 +08:00
decorator 好久之前好像看到过一个这个方法,思想就是用new函数来判定,如果new函数被执行过一次之后,那么就不再执行。如果没被执行,那么就执行一次
|
4
binux 2014-07-01 20:43:07 +08:00 1
def cached(f):
...._cache = {} [email protected](f) ....def wrapper(self, *args, **kwargs): ........key = '-|-'.join(map(unicode, args))\ ................+'-|-'.join('%s-:-%s' % x for x in kwargs.iteritems()) ........if key in _cache: ............return _cache[key] ........ret = f(*args, **kwargs) ........_cache[key] = ret ........return ret ....return wrapper |
5
messense 2014-07-01 20:45:07 +08:00
class A(object):
----def cal_once(self): --------if not hasattr(self, '_cal_once'): ------------# do whatever you want ------------print('there you go') ------------self._cal_once = 'xxx' --------return self._cal_once 类似这样? |
6
riaqn 2014-07-01 21:34:43 +08:00 1
Example of efficiently computing Fibonacci numbers using a cache to implement a dynamic programming technique:
@lru_cache(maxsize=None) def fib(n): if n < 2: return n return fib(n-1) + fib(n-2) >>> [fib(n) for n in range(16)] [0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377, 610] >>> fib.cache_info() CacheInfo(hits=28, misses=16, maxsize=None, currsize=16) New in version 3.2. Changed in version 3.3: Added the typed option. https://docs.python.org/3.3/library/functools.html#functools.lru_cache |
10
Niris 2014-07-01 22:42:56 +08:00 1
用 Descriptor。
例子可以看 https://github.com/defnull/bottle/blob/master/bottle.py#L194-L218 不明白 @property、@classmethod、@staticmethod 的话,官方有个 howto: https://docs.python.org/3/howto/descriptor.html |
12
SakuraSa OP @binux 的确如你所说,如果直接去掉self参数,实际上相当于把cache保存在类上,而非实例上
这样会导致相应cache所占的内存不能随着实例自然释放 但是如果不修改,代码似乎并不能符合预期的工作: http://codepad.org/2N6QMAWW 我现在的解决方案是: https://github.com/SakuraSa/LruCache.py/blob/master/lru.py 使用其中的Cache修饰器 |
13
binux 2014-07-02 10:26:13 +08:00 1
|
14
SakuraSa OP 感谢@binux
根据你的提示,得到了想要的结果http://codepad.org/QMl6motG 另外LruCache.py也做了相应的修改 https://github.com/SakuraSa/LruCache.py/blob/master/lru.py#L114-125 现在cache存放的位置应该和实例一致了 |