- 1.装饰器
- 2.装饰器的嵌套
- 3.带有参数的装饰器
- 4.面向对象的装饰器
1.装饰器
def check(func):
def checkAndLog():
print("函数运行前:权限校验...")
func()
print("函数运行后:日志记录...")
return checkAndLog
def printInfo():
print("我是一个普通的函数")
newFunc = check(printInfo) #返回内部函数
newFunc() #执行内部函数
# printInfo()
输出结果:
函数运行前:权限校验…
我是一个普通的函数
函数运行后:日志记录
使用装饰器
def check(func):
def checkAndLog():
print("函数运行前:权限校验...")
func()
print("函数运行后:日志记录...")
return checkAndLog
@check #定义装饰器修饰的位置,相当于check(printInfo)
def printInfo():
print("我是一个普通的函数")
@check
def test():
print("test....")
printInfo() #执行函数前,会先执行装饰器
test()
2.装饰器的嵌套输出结果:
函数运行前:权限校验…
我是一个普通的函数
函数运行后:日志记录…
函数运行前:权限校验…
test…
函数运行后:日志记录…
def zsA(func):
def resFunc():
print("zsA执行前...")
func()
print("zsA执行后...")
return resFunc
def zsB(func):
def resFunc():
print("zsB执行前...")
func()
print("zsB执行后...")
return resFunc
@zsB
@zsA #自下而上逐步修饰,完成后一次性输出
def test():
print("这是测试函数")
test()
#相当于:
res1 = zsA(test)
res2 = zsB(res1)
res2()
3.带有参数的装饰器
如果原函数带有参数,那么返回的新函数也要带有参数,且参数一一对应
def tool(func):
def log(name,pwd):
print(f"日志记录:【{name}:{pwd}】")
#接收func()函数的返回值
state=func(name,pwd)
return state
return log
@tool
def login(name,pwd):
print(f"用户名:{name},密码:{pwd}")
if name=="admin" and pwd==123456:
return "登录成功"
return "登录失败"
ls=login("admin",123456)
print(ls)
def tool(func):
#最常使用的方法
def log(*args,**kwargs):
print(f"日志记录前.......")
state=func(*args,**kwargs)
print(f"日记记录后.......")
return state
return log
@tool
def login(name,kwd):
print(f"用户名:{name},密码:{pwd}")
if name=="admin" and pwd==123456:
return "登录成功"
return "登录失败"
ls1=login("admin",123456)
print(ls1)
ls2=test()
print(ls2)
4.面向对象的装饰器
class MyTool:
#当MyTool当作函数调用时,call自动被调用
def __call__(self,func):
#去找到类里面的tool2,再调用tool2(func)
return self.tool2(func)
def tool1(func):
def log():
print("log....")
func()
return log
#调用tool2,返回值是check
def tool2(self,func):
def check():
print("check....")
func()
return check
#调用方法一:
@MyTool.tool1
def test():
print("test....")
test()
#调用方法二
@MyTool() #通过函数的方式调用MyTool,可以自动触发call内置函数
def test():
print("test....")
test()
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)