一、使用不带参数的函数装饰器装饰函数
def decorator(func):
def wrapper(*args, **kwargs):
print("新增的功能")
return func() #运行func函数,并返回func函数的返回参数,或者写作:ret=func()
# return ret
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
的返回值是一个类