1、前言
使用装饰器将函数作为参数,最后再返回一个参数,简单来说就是在不修改原函数的代码上对原函数添加新的功能。
2、实测用例
(1)在原函数中添加一个装饰器
原函数:
def SayHello():
print("Hello,World")
SayHello()
添加装饰器后:
import functools
def decorator(fun): #fun为调用的函数
@functools.wraps(fun)
def wrapper(*args,**kwargs):
print("Hello,Python") #添加的功能
fun(*args,**kwargs)
return wrapper #调用添加功能的函数
@decorator
def SayHello():
print("Hello,World")
SayHello()
1、@decorator相当于SayHello = decorator(SayHello)
2、*args,**kwargs 表示可以接受任意的参数
3、@functools.wraps(fun) 保存原函数的属性,如name,model等
(2)在原函数中添加多个装饰器
import functools
def decorator(fun): #fun为调用的函数
@functools.wraps(fun)
def wrapper(*args,**kwargs):
print("Hello,Python") #添加的功能
fun(*args,**kwargs)
return wrapper #调用添加功能的函数
def decorator1(fun):
@functools.wraps(fun)
def wrapper(*args,**kwargs):
print("I Lov Study")
fun(*args,**kwargs)
return wrapper
@decorator1
@decorator
def SayHello():
print("Hello,World")
SayHello()
调用方式:
SayHello = decorator1(SayHello)
SayHello = decorator(SayHello)
(3)装饰器传入参数
import functools
def GetNum(num):
def decorator(fun): #fun为调用的函数
@functools.wraps(fun)
def wrapper(*args,**kwargs):
print("Hello,Python") #添加的功能
print("Getnum %d"%(int(num)))
fun(*args,**kwargs)
return wrapper #调用添加功能的函数
return decorator
@GetNum('10') #传入参数
def SayHello():
print("Hello,World")
SayHello()
注:只需再填写一个高阶函数返回decorator即可