如何访问装饰器属性?

问题描述 投票:3回答:1

是否可以在Python 3中访问装饰器属性?

例如:在调用修饰的fibonacci方法之后是否可以访问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 ###
python decorator python-decorators
1个回答
5
投票

装饰一个函数(或类,或其他东西)时,实际上是用装饰器的返回值替换装饰的对象。这意味着:

@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>

因此,为了获得高速缓存未命中的数量,您只需要访问fibonaccimisses属性:

>>> fibonacci.misses
21
© www.soinside.com 2019 - 2024. All rights reserved.