gpt4 book ai didi

python - 在运行时向函数对象添加方法

转载 作者:太空宇宙 更新时间:2023-11-03 23:49:44 24 4
gpt4 key购买 nike

我之前读到一个问题,问在 Python 中是否有一个 times 方法,它允许一个函数被连续调用 n 次。

每个人都建议 for _ in range(n): foo() 但我想尝试使用函数装饰器编写不同的解决方案。

这是我所拥有的:

def times(self, n, *args, **kwargs):
for _ in range(n):
self.__call__(*args, **kwargs)

import new
def repeatable(func):
func.times = new.instancemethod(times, func, func.__class__)

@repeatable
def threeArgs(one, two, three):
print one, two, three

threeArgs.times(7, "one", two="rawr", three="foo")

当我运行程序时,出现以下异常:

Traceback (most recent call last):  File "", line 244, in run_nodebug  File "C:\py\repeatable.py", line 24, in     threeArgs.times(7, "one", two="rawr", three="foo")AttributeError: 'NoneType' object has no attribute 'times'

所以我想装饰器没有工作?我该如何解决这个问题?

最佳答案

你的装饰器应该返回函数对象:

def repeatable(func):
func.times = new.instancemethod(times, func, func.__class__)
return func

现在它什么都不返回,所以你实际上改变了一个 None 中的 threeArgs

这是因为:

@decorator
def func(...):
...

或多或少相同:

def func(...):
....
func = decorator(func)

关于python - 在运行时向函数对象添加方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2660093/

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