python中的装饰器---重点
装饰器本质上是一个python的函数,它可以让其他函数在不改变源代码和调用方式的前提下增加额外的功能
原则:
1、不能修改被装饰函数的源代码
2、不能改变被装饰函数的调用方式
知识储备:
1、函数即变量
2、高阶函数
- 把一个函数名当做实参 传递给另外一个函数
-返回值中包含函数
3、函数嵌套
记住:这三个知识点就能写出来装饰器
1、普通装饰器函数及其本质
def outer_warper(test): def warper(): print("in the decorator warper function") re = test() return warper # 返回内部函数的入口地址 def test(): print("in the function test") return "test function" # 本质就是: test = outer_warper(test) # test()实际上就是warper() test()
换上python中语法糖的写法
def outer_warper(test): def warper(): print("in the decorator warper function") re = test() return warper # 返回内部函数的入口地址 @outer_warper def test(): print("in the function test") return "test function" # 本质就是: # test = outer_warper(test) test()
2、被装饰的函数带参数
def outer_warper(test): def warper(*args,**kwargs): print("in the decorator warper function") re = test(*args,**kwargs) return warper # 返回内部函数的入口地址 def test(name,age): print("in the function test") print("in the test function name = %s age =%s"%(name,age)) return "test function" # 本质就是: test = outer_warper(test) # test(name,age) = warper(name,age) test("alex",33)
换成语法糖的写法:
def outer_warper(test): def warper(*args,**kwargs): print("in the decorator warper function") re = test(*args,**kwargs) return warper # 返回内部函数的入口地址 @outer_warper def test(name,age): print("in the function test") print("in the test function name = %s age =%s"%(name,age)) return "test function" # 本质就是: # test = outer_warper(test) # test(name,age) = warper(name,age) test("alex",33)
3、装饰器本身带传递参数的时候,要写三层嵌套函数
def three_outer_warper(province,city): def outer_warper(test): def warper(*args,**kwargs): print("in the decorator warper function") print("in dec warper function province = %s city = %s "%(province,city)) re = test(*args,**kwargs) return warper # 返回内部函数的入口地址 return outer_warper def test(name,age): print("in the function test") print("in the test function name = %s age =%s"%(name,age)) return "test function" # 本质就是: test = three_outer_warper("shanxi","xian")(test) test("alex",33)
换成带装饰器的写法:
def three_outer_warper(province,city): def outer_warper(test): def warper(*args,**kwargs): print("in the decorator warper function") print("in dec warper function province = %s city = %s "%(province,city)) re = test(*args,**kwargs) return warper # 返回内部函数的入口地址 return outer_warper @three_outer_warper("sichuan","chengdu") def test(name,age): print("in the function test") print("in the test function name = %s age =%s"%(name,age)) return "test function" # 本质就是: # test = three_outer_warper("shanxi","xian")(test) test("alex",33)