gpt4 book ai didi

python - 如何用可调用类装饰类方法?

转载 作者:太空宇宙 更新时间:2023-11-03 13:25:26 25 4
gpt4 key购买 nike

我希望类中的函数将它们的返回值存储在某种数据结构中。为此,我想使用装饰器:

results = []
instances = []

class A:
def __init__(self, data):
self.data = data

@decorator
def f1(self, a, b):
return self.data + a + b

@decorator
def f2(self, a):
return self.data + a + 1

x = A(1)
x.f1(1, 2)
x.f2(3)

print(results)

问题是,如何实现这个装饰器。

主要思想如下:

class Wrapper:

def __init__(self, func):
self.func = func

def __call__(self, *args):
res = self.func(*args)
results.append(res)
instances.append(args[0])

def decorator(func):
return Wrapper(func)

但随后我收到一条错误消息:

TypeError: f1() missing 1 required positional argument: 'b'

这个问题和其他人问的类似(How to decorate a method inside a class?Python functools.wraps equivalent for classes),但是不清楚在哪里放置@functools.wraps或者调用@functools。 update_wrapped() 在我的例子中。

最佳答案

我认为这就是您的要求。

In [8]: from functools import wraps 
...: results = []
...: instances = []
...:
...: class A:
...: def __init__(self, data):
...: self.data = data
...:
...: def decorator(f):
...: @wraps(f)
...: def inner(*args, **kwargs):
...: retval = f(*args, **kwargs)
...: results.append(retval)
...: return retval
...: return inner
...:
...:
...: @decorator
...: def f1(self, a, b):
...: return self.data + a + b
...:
...: @decorator
...: def f2(self, a):
...: return self.data + a + 1
...:

In [9]: a = A(3)

In [10]: a.f1(2,3)
Out[10]: 8

In [11]: results
Out[11]: [8]

Decorator 不必在类中,但当您需要访问类实例本身时,它会很方便。您无需更改任何代码即可将其取出。

In [8]: from functools import wraps 
...: results = []
...: instances = []

...: def decorator(f):
...: @wraps(f)
...: def inner(*args, **kwargs):
...: retval = f(*args, **kwargs)
...: results.append(retval)
...: return retval
...: return inner
...:
...: class A:
...: def __init__(self, data):
...: self.data = data
...:
...:
...:
...: @decorator
...: def f1(self, a, b):
...: return self.data + a + b
...:
...: @decorator
...: def f2(self, a):
...: return self.data + a + 1
...:

In [9]: a = A(3)

In [10]: a.f1(2,3)
Out[10]: 8

In [11]: results
Out[11]: [8]

效果相同。

关于python - 如何用可调用类装饰类方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56904802/

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