考虑下面的装饰函数,它返回一个修饰函数,或参数化的装饰函数<强>或< /强>函数:
from functools import wraps, partial, update_wrapper
from inspect import signature
def wrapit(func=None, *, verb='calling'):
if func is None: # return a decoratOR
return partial(wrapit, verb=verb)
else: # return a decoratED
@wraps(func)
def _func(*args, **kwargs):
print(f'{verb} {func.__name__} with {args} and {kwargs}')
return func(*args, **kwargs)
return _func
演示:
>>> f = lambda x, y=1: x + y
>>> ff = wrapit(verb='launching')(f)
>>> assert ff(10) == 11
launching <lambda> with (10,) and {}
>>> assert signature(ff) == signature(f)
>>>
>>> # but can also use it as a "decorator factory"
>>> @wrapit(verb='calling')
... def f(x, y=1):
... return x + y
...
>>> assert ff(10) == 11
launching <lambda> with (10,) and {}
>>> assert signature(ff) == signature(f)
类表单可以如下所示:
class Wrapit:
def __init__(self, func, verb='calling'):
self.func, self.verb = func, verb
update_wrapper(self, func)
def __call__(self, *args, **kwargs):
print(f'{self.verb} {self.func.__name__} with {args} and {kwargs}')
return self.func(*args, **kwargs)
但是,我们如何使类能够在函数形式(由if func is None: return partial...
实现)的“装饰器工厂”模式下运行呢
我们如何将这个技巧集成到decorator类中
正如评论中所建议的,您可以使用
__new__
方法执行此操作:每当您尝试实例化一个类时,就会调用
__new__
方法,并且该方法的返回值将用作尝试实例化的结果,即使它不是该类的实例我接受了@pppery的回答,因为。。。这就是答案。我想通过展示如何通过在父类中编码逻辑来获得更多的重用来扩展这里的答案。这需要将@pppery的逻辑分为
__new__
和__init__
方法演示:
相关问题 更多 >
编程相关推荐