【发布时间】:2019-09-05 15:40:07
【问题描述】:
我正在关注David Beazley's Python Cookbook 的类装饰器配方,这似乎更合适,因为它使用functools.wraps 为装饰器提供更好的组织和属性。
但是,我不太清楚如何(或是否)从装饰器本身访问实例的属性。这是代码的sn-p:
import time
import types
from functools import wraps
class TimeDecorator():
def __init__(self, func):
wraps(func)(self)
def __call__(self, *args, **kwargs):
tic = time.time()
func_return = self.__wrapped__(*args, **kwargs)
tac = time.time()
total_time = round((tac - tic) / 60, 2)
print(f'Operation Time: {total_time} min.')
# print(self.__wrapped__.test_attr) # going to give an error...
return func_return
def __get__(self, instance, cls):
if instance is None:
return self
else:
return types.MethodType(self, instance)
class A():
def __init__(self):
self.test_attr = 0
@TimeDecorator
def do_something(self):
time.sleep(1) # example of stuff only...
我尝试从装饰器的__call__ 到self.__wrapped__.test_attr 或self.__wrapped__.__self__.test_attr 访问实例,但它们都告诉我:
AttributeError: 'function' object has no attribute 'test_attr'
那么在这种情况下,我将如何访问装饰类的属性?还是我必须使用另一种方式来构建我的装饰器?
【问题讨论】:
标签: python decorator python-decorators