gpt4 book ai didi

python - 如何通过 `functools.wraps` 从类装饰器访问装饰类的属性

转载 作者:太空宇宙 更新时间:2023-11-04 11:12:47 24 4
gpt4 key购买 nike

我正在关注 David Beazley's Python Cookbook的类装饰器配方,这似乎更合适,因为它使用 functools.wraps 为装饰器提供更好的组织和属性。

但是,我不太清楚如何(或是否)从装饰器本身内部访问实例的属性。这是代码片段:

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

我尝试通过 self.__wrapped__.test_attrself.__wrapped__.__self__.test_attr 从装饰器的 __call__ 访问实例, 但他们都告诉我:

AttributeError: 'function' object has no attribute 'test_attr'

那么在这种情况下我怎样才能访问装饰类的属性呢?还是我必须使用另一种方式来构建我的装饰器?

最佳答案

您在实例方法上应用装饰器,因此该装饰方法绑定(bind)到的实例将作为第一个参数 self 传入,这是您可以找到该实例的地方您正在寻找的属性,因此您只需从参数中提取 self,在下面的示例中命名为 wrapped_self:

def __call__(self, wrapped_self, *args, **kwargs):
tic = time.time()
func_return = self.__wrapped__(wrapped_self, *args, **kwargs)
tac = time.time()
total_time = round((tac - tic) / 60, 2)
print(f'Operation Time: {total_time} min.')
print(wrapped_self.test_attr)
return func_return

关于python - 如何通过 `functools.wraps` 从类装饰器访问装饰类的属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57808886/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com