Python进阶精华-编写装饰器为被包装的函数添加参数
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Python进阶精华-编写装饰器为被包装的函数添加参数相关的知识,希望对你有一定的参考价值。
参考技术A 注意:这种发方法并不是装饰器最常用的功能,但是在降低代码重复上可谓是首屈一指。比如:如果不使用装饰器,上述代码可能会很多:当然,这里也有一个潜在的风险,就是当装饰器包裹的函数已经用了debug作为参数名,那么装饰器这里将会报错,所以要添加额外的一些判断来完善代码:
最后还剩下一部分比较难理解的地方,我将理解的注释在每行代码上方,这个问题就是,在打印被修饰函数的参数签名时,其实并不能正确显示参数签名,原因是因为被wrapper修饰过后的函数实际上应该使用的是wrapper的参数签名表,例如:
所以,接下来,完成最后最难的一步:
python 装饰器
Python装饰器
1.装饰器解释
1.1 装饰器它是一个函数,它包含了另一个函数的功能。它用于装饰被包含函数,为被包含的函数添加附加功能。
1.2 装饰器作用于被包含的函数,只有被包含的函数执行时,装饰器才起作用。
2.装饰器代码构成
2.1 函数嵌套(函数中包含另外函数,通俗讲:def 中还有 def )
2.2 高阶函数(返回函数,确切说是返回函数内存地址)
3. 装饰器代码写法
3.1 二层装饰器代码
1 import time 2 3 # 定义装饰器(含两个def,就是所说的函数嵌套) 4 def packing(func): 5 print(‘in the packing‘) 6 7 def deco(*args, **kwargs): 8 start_time = time.time() 9 func(*args, **kwargs) 10 stop_time = time.time() 11 print(‘the func run ‘, stop_time-start_time) 12 return deco # 返回函数内存地址(能返回函数内存地址的函数就是高阶函数) 13 14 15 @packing # 等价于 test1 = packing(test1)(取得了deco的内存地址) 16 def test1(name): 17 time.sleep(1) 18 print(‘int the test1‘, name) 19 20 21 @packing 22 def test2(age, sex): 23 time.sleep(0.3) 24 print(‘in the test2‘, age, sex) 25 26 27 test1(‘alex‘) # 相当于执行deco() 函数调用,装饰器才起作用 28 test2(17, ‘F‘) # 相当于执行deco() 函数调用,装饰器才起作用
3.2 三层装饰器代码
1 usrname = ‘alex‘ 2 passwd = ‘123456‘ 3 def auth(auth_type): 4 def outpacking(func): 5 def packing(*args, **kwargs): 6 if auth_type == ‘local‘: 7 name = input(‘input your usrname:\n‘) 8 pd = input(‘input your passowrd:\n‘) 9 if usrname == name and passwd == pd: 10 print(‘welcom %s‘ %usrname) 11 12 else: 13 print(‘\033[31;1minvalid usrname or password\033[0m‘) 14 exit() 15 elif auth_type == ‘remote‘: 16 print(‘remote access your account‘) 17 func(*args, **kwargs) 18 return packing 19 return outpacking 20 21 def index(): 22 print(‘welcom to the index page‘) 23 24 25 @auth(auth_type=‘local‘) 26 def home(): 27 print(‘welcom to home page‘) 28 29 @auth(auth_type=‘remote‘) 30 def bbs(): 31 print(‘welcom to the bbs page‘) 32 33 34 index() 35 home() 36 bbs()
以上是关于Python进阶精华-编写装饰器为被包装的函数添加参数的主要内容,如果未能解决你的问题,请参考以下文章