一、使用不带参数的函数装饰器装饰函数
def decorator(func):
def wrapper(*args, **kwargs):
print("新增的功能")
return func()
return wrapper
@decorator
def my_func():
print("我需要增加功能")
相当于:
my_func = decorator(my_func)
此时,运行my_func(),相当于运行decorator(my_func)的返回值wrapper() 如果你想运行其他函数也无所谓,只要通过decorator(my_func)返回 不过你应该返回一个函数,而不是一个可调用的类
二、使用带参数的函数装饰器装饰函数
def outer(*args, **kwargs):
def decorator(func):
def wrapper(*args, **kwargs):
print("新增的功能")
return func()
return wrapper
return decorator
@outer('参数')
def my_func():
print("我需要增加功能")
相当于:
my_func = outer('参数')(my_func)
此时,运行my_func(),相当于运行outer('参数')(my_func)的返回值wrapper() outer('参数')的返回值为decorator,然后decorator(my_func)返回wrapper()
三、使用不带参数的函数装饰器装饰类
def decorator(cls):
print("新增的功能")
return cls
@decorator
class MyClass:
def __init__(self):
pass
相当于:
MyClass = decorator(MyClass)
此时,运行my_func(),相当于运行decorator(MyClass)的返回值 所以decorator(MyClass)的返回值应该是一个类 要注意的是decorator()函数中的内容会在加载时运行
四、使用带参数的函数装饰器装饰类
def outer(*args, **kwargs):
def decorator(cls):
print("新增的功能")
return cls
return decorator
@outer('参数')
class MyClass:
def __init__(self):
pass
相当于:
MyClass = outer('参数')(MyClass)
运行MyClass相当于运行decorator(cls)的返回值cls outer()的返回值是一个可调用对象decorator,并且decorator的返回值是一个类
|