1.带有参数的装饰器示例
def decorator(arg1, arg2):
def real_decorator(func):
def wrapper(*args, **kwargs):
print("You decorated a function that does something with %s and %s" % (arg1, arg2))
func(*args, **kwargs)
return wrapper
return real_decorator
@decorator("args1", "args2")
def print_args(*args):
for arg in args:
print(arg)
print_args(1, 2, 3)
测试结果
>>> print_args(1, 2, 3)
You decorated a function that does something with args1 and args2
1
2
3
>>>
2.基于类的装饰器
class MyDecorator(object):
def __init__(self, func_to_decorate):
print("init MyDecorator")
self.func_to_decorate = func_to_decorate
def __call__(self, *args, **kwargs):
print("call MyDecorator")
return self.func_to_decorate(*args, **kwargs)
@MyDecorator
def print_more_args(*args):
for arg in args:
print(arg)
print_more_args(1, 2, 3)
print("------------")
print_more_args(1, 2, 3)
测试结果
init MyDecorator
call MyDecorator
1
2
3
------------
call MyDecorator
1
2
3
3.带有参数的基于类的装饰器
class MyDecoratorWithParams(object):
def __init__(self, arg1, arg2):
print("init MyDecoratorWithParams")
print(arg1)
print(arg2)
def __call__(self, fn, *args, **kwargs):
print("call MyDecoratorWithParams")
def new_func(*args, **kwargs):
print("function has been decorated.")
return fn(*args,**kwargs)
return new_func
@MyDecoratorWithParams("arg1", "arg2")
def print_args_again(*args):
for arg in args:
print(arg)
print_args_again(1, 2, 3)
print("----------------")
print_args_again(1, 2, 3)
测试结果:
init MyDecoratorWithParams
arg1
arg2
call MyDecoratorWithParams
function has been decorated.
1
2
3
----------------
function has been decorated.
1
2
3