gpt4 book ai didi

Python:可选参数装饰器作为类的实现

转载 作者:行者123 更新时间:2023-12-05 03:54:28 25 4
gpt4 key购买 nike

看完优秀Primer on Python Decorators我想将文章中的一些奇特(高级)装饰器实现为类作为练习。

例如带参数的装饰器示例

def repeat(num_times):
def decorator_repeat(func):
@functools.wraps(func)
def wrapper_repeat(*args, **kwargs):
for _ in range(num_times):
value = func(*args, **kwargs)
return value
return wrapper_repeat
return decorator_repeat

可以像这样实现为一个类

class Repeat:
def __init__(self, times):
self.times = times

def __call__(self, fn):
def _wrapper(*args, **kwargs):
for _ in range(self.times):
result = fn(*args, **kwargs)
return result
return _wrapper

但是我似乎无法找到 optional argument decorator example 的类解决方案:

def repeat(_func=None, *, num_times=2):
def decorator_repeat(func):
@functools.wraps(func)
def wrapper_repeat(*args, **kwargs):
for _ in range(num_times):
value = func(*args, **kwargs)
return value
return wrapper_repeat

if _func is None:
return decorator_repeat
else:
return decorator_repeat(_func)

是我,还是那个人很邪恶? XD很想看到解决方案!

最佳答案

您可以覆盖 __new__ 方法来实现相同的行为:

def __new__(cls, _func=None, *, times=2):
obj = super().__new__(cls)
obj.__init__(times)
if _func is None:
return obj
else:
return obj(_func)

这样两者:

@Repeat
def a():
print('hi')

和:

@Repeat(times=2)
def a():
print('hi')

输出:

hi
hi

关于Python:可选参数装饰器作为类的实现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60946747/

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