一、使用不带参数的函数装饰器装饰函数
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 的返回值是一个类
|