为什么学习装饰器:

  • 行业需求:涉及 python 技术栈,面试常见题
  • 使用需求:优化代码可读性,可维护性

未带参装饰器

 1 # 第一步:定义两个函数,一个内函数,一个外函数
 2 def pre(func):
 3     def inner():
 4         # 第二步:在内函数添加装饰器的逻辑
 5         print('Tom said:')
 6         # 第六步:添加被装饰函数的执行步骤
 7         func()
 8         print('seeyou')
 9     # 第三步:把内函数的函数对象return 出去
10     return inner
11 
12 # 第四步:装饰器的使用
13 @pre    #等同于 fun0 = pre(fun0)
14 def func0():
15     print('hello,Python')
16 
17 func0()
18 
19 '''
20 执行结果:
21 Tom said:
22 hello,Python
23 seeyou
24 '''

被装饰函数参数不固定

 1 #被装饰函数参数不固定
 2 #*args:可变参数,**kwargs:关键字可变参数
 3 
 4 def pre(func):
 5     def inner(*args,**kwargs):
 6         print('Tom said:')
 7         func(*args,**kwargs)
 8     return inner
 9 
10 @pre
11 def func1(name1,name2):
12     print(f"hello {name1},I am {name2}")
13     # print('hello,%s,I am %s!'%(name1,name2))
14 
15 @pre
16 def func2(name1):
17     print(f"seeyou {name1}")
18 
19 func1('Lily','Tom')
20 func2('lily')
21 
22 '''
23 执行结果:
24 Tom said:
25 hello Lily,I am Tom
26 Tom said:
27 seeyou lily
28 '''

装饰函数携带参数

 1 #装饰函数携带参数
 2 #*args:可变参数,**kwargs:关键字可变参数
 3 
 4 def pre_args(name):
 5     def pre(func):
 6         def innerinner(*args,**kwargs):
 7             print(f"{name} said:")
 8             func(*args,**kwargs)
 9         return innerinner
10     return pre
11 
12 @pre_args('Tom')
13 def func1(name1,name2):
14     print(f"hello {name1},I am {name2}")
15 
16 @pre_args('Jack')
17 def func2(name1):
18     print(f"seeyou {name1}")
19 
20 func1('Lily','Tom')
21 func2('lily')
22 
23 '''
24 执行结果:
25 Tom said:
26 hello Lily,I am Tom
27 Jack said:
28 seeyou lily
29 '''

 

笔记2023-04-19

posted on 2023-04-19 00:02  三天乐趣  阅读(84)  评论(0编辑  收藏  举报