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() 函数调用,装饰器才起作用
View Code

 

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()
View Code

 

以上是关于Python进阶精华-编写装饰器为被包装的函数添加参数的主要内容,如果未能解决你的问题,请参考以下文章

python 装饰器

无参装饰器为被装饰函数添加统计时间的功能

[TimLinux] Python 装饰器

python 类的装饰器

1Python进阶强化训练之装饰器使用技巧进阶

Python进阶之装饰器