Python:可选参数decorator作为类的实现

Python:可选参数decorator作为类的实现,python,oop,decorator,Python,Oop,Decorator,在阅读了这篇优秀的文章之后,我想到将文章中的一些高级装饰器作为类来实现,作为一个练习 例如,带有参数的装饰器示例 def repeat(num_times): def decorator_repeat(func): @functools.wraps(func) def wrapper_repeat(*args, **kwargs): for _ in range(num_times): value =

在阅读了这篇优秀的文章之后,我想到将文章中的一些高级装饰器作为类来实现,作为一个练习

例如,带有参数的装饰器示例

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
但是,我似乎无法为以下问题找到类解决方案:

只是我一个人,还是那个人很邪恶?除息的
希望看到解决方案

您可以覆盖
\uuuu new\uuu
方法以实现相同的行为:

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')
以及:

输出:

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