如何访问装饰器属性?
How to access decorator attributes?
是否可以在 Python 3 中访问装饰器属性?
例如:是否可以在调用装饰斐波那契方法后访问self.misses
?
class Cache:
def __init__(self, func):
self.func = func
self.cache = {}
self.misses = 0
def __call__(self, *args):
if not (args in self.cache):
self.misses += 1
self.cache[args] = self.func(*args)
return self.cache[args]
@Cache
def fibonacci(n):
return n if n in (0, 1) else fibonacci(n - 1) + fibonacci(n - 2)
fibonacci(20)
### now we want to print the number of cache misses ###
当你装饰一个函数(或class,或其他任何东西)时,你实际上是用return值替换被装饰的对象装饰者。这意味着:
@Cache
def fibonacci(n):
return n if n in (0, 1) else fibonacci(n - 1) + fibonacci(n - 2)
相当于:
def fibonacci(n):
return n if n in (0, 1) else fibonacci(n - 1) + fibonacci(n - 2)
fibonacci = Cache(fibonacci)
因此,fibonacci
现在是一个 Cache
实例而不是一个函数:
>>> fibonacci
<__main__.Cache object at 0x7fd4d8b63e80>
所以为了得到缓存未命中数,你只需要访问fibonacci
的misses
属性:
>>> fibonacci.misses
21
是否可以在 Python 3 中访问装饰器属性?
例如:是否可以在调用装饰斐波那契方法后访问self.misses
?
class Cache:
def __init__(self, func):
self.func = func
self.cache = {}
self.misses = 0
def __call__(self, *args):
if not (args in self.cache):
self.misses += 1
self.cache[args] = self.func(*args)
return self.cache[args]
@Cache
def fibonacci(n):
return n if n in (0, 1) else fibonacci(n - 1) + fibonacci(n - 2)
fibonacci(20)
### now we want to print the number of cache misses ###
当你装饰一个函数(或class,或其他任何东西)时,你实际上是用return值替换被装饰的对象装饰者。这意味着:
@Cache
def fibonacci(n):
return n if n in (0, 1) else fibonacci(n - 1) + fibonacci(n - 2)
相当于:
def fibonacci(n):
return n if n in (0, 1) else fibonacci(n - 1) + fibonacci(n - 2)
fibonacci = Cache(fibonacci)
因此,fibonacci
现在是一个 Cache
实例而不是一个函数:
>>> fibonacci
<__main__.Cache object at 0x7fd4d8b63e80>
所以为了得到缓存未命中数,你只需要访问fibonacci
的misses
属性:
>>> fibonacci.misses
21