面向对象-装饰器

装饰器是什么?
为了增加功能而对函数或者类进行功能扩充的一种语法。

 

第一步:声明一个普通函数即可

1 #第一步:声明一个普通函数即可
2 def love():
3     print('亲亲')
4 
5 #调用函数:
6 love()
7 #输出结果:亲亲
8 love()
9 #输出结果:亲亲

 

第二步:增加功能

 1 #第二步:增加功能
 2 #定义增加功能的函数
 3 def decor(func):
 4     #增加功能1
 5     print('抱抱')
 6     #调用基本函数
 7     func()#相当于调用love
 8     #增加功能2
 9     print('举高高')
10 
11 #基本函数
12 def love():
13     print('亲亲')
14 
15 love = decor(love)#将基本函数作为参数传入装饰函数中
16 
17 #调用函数
18 #love()
19 print(love)
20 '''
21 输出结果:
22 抱抱
23 亲亲
24 举高高
25 None
26 '''

 

第三步:基本的装饰器

 1 #第三步:基本的装饰器
 2 
 3 #装饰器函数
 4 def decor(func):
 5     #声明一个内部函数
 6     def inner():
 7         # 增加功能1
 8         print('抱抱')
 9         # 调用基本功能
10         func()
11         # 增加功能2
12         print('举高高')
13 
14     #必须返回函数
15     return inner #未来的love函数
16 
17 #基本函数
18 def love():
19     print('亲亲')
20 
21 love = decor(love)#装饰操作
22 
23 #print(love)
24 #调用函数
25 love()
26 
27 '''
28 输出结果:
29 抱抱
30 亲亲
31 举高高
32 '''

 

第四步:装饰器语法

 1 #第四步:装饰器语法
 2 #装饰器函数
 3 def decor(func):
 4     #定义内部函数 就是未来的love函数
 5     def inner():
 6         #增加功能1
 7         print('抱抱')
 8         #调用基本函数
 9         func()
10         #增加功能2
11         print('举高高')
12 
13     #返回内部函数
14     return inner
15 
16 #定义基本函数
17 @decor #装饰操作   等价于  love = decor(love)
18 def love():
19     print('亲亲')
20 
21 #调用函数
22 love()
23 '''
24 输出结果:
25 抱抱
26 亲亲
27 举高高
28 '''

 

第五步:为基本函数添加 返回值和参数
 1 #第五步:为基本函数添加 返回值和参数
 2 #返回值的处理方式
 3 #定义装饰函数
 4 def decor(func):
 5     #定义一个内部函数
 6     def inner():
 7         #增加的功能
 8         print('抱抱')
 9         #基本功能
10         var = func()#相当于调用了love
11         #增加的功能
12         print('举高高')
13         #返回一个值 是原有基本函数的返回值
14         return var
15     #返回内部函数
16     return inner
17 #定义基本函数
18 @decor # love = decor(love)
19 def love():
20     print('亲亲')
21     return ''
22 #调用函数
23 
24 result = love()
25 print(result)
26 
27 '''
28 输出结果:
29 抱抱
30 亲亲
31 举高高
32 33 '''
 1 #参数的处理方式####################第五步-2#######################
 2 #定义装饰函数
 3 def decor(func):
 4     #定义内部函数
 5     def inner(w1,w2):
 6         #增加功能1
 7         print('抱抱')
 8         #调用基本功能
 9         func(w1,w2) #相当调用love
10         #增加功能2
11         print('举高高')
12 
13     #返回内部函数inner  是未来的love函数
14     return inner
15 #定义基本函数
16 @decor  # love = decor(love)
17 def love(who1,who2):
18     print('{}亲亲{}'.format(who1,who2))
19 #调用函数
20 love('妈妈','女儿')
21 '''
22 输出结果:
23 抱抱
24 妈妈亲亲女儿
25 举高高
26 '''

 

第六步 加上收集参数(收集参数,关键字收集参数)

 1 #第六步 加上收集参数(收集参数,关键字收集参数)
 2 #定义装饰器
 3 def decor(func):
 4     #定义内部函数
 5     def inner(*p,**w):#装饰之后的love函数
 6         #增加功能
 7         print('抱抱')
 8         #基本函数
 9         func(*p,**w)
10         #增加功能2
11         print('举高高')
12     #返回内部函数
13     return inner
14 #定义基本函数
15 @decor  # love = decor(love)
16 def love(*parent,**child):
17     print(parent,'亲亲',child)
18 #调用基本函数
19 love('爸爸','妈妈',son = '儿子',girl = '女儿')
20 '''
21 输出结果:
22 抱抱
23 ('爸爸', '妈妈') 亲亲 {'son': '儿子', 'girl': '女儿'}
24 举高高
25 '''

 

第七步: 为装饰器添加参数

 1 #第七步: 为装饰器添加参数
 2 #定义装饰器  一个装饰器同时装饰多个函数(不同的函数装饰不同的内容)
 3 def outer(arg): #调用outer返回装饰器
 4     #定义装饰器  #---------------------start----------------------
 5     def decor(func):
 6         #定义内部函数
 7         def inner():
 8             #判断正在装饰的函数
 9             if arg == 'xiao':
10                 # 增加功能
11                 print('我给你将一个笑话')
12                 # 调用基本函数
13                 func()
14                 # 增加功能
15                 print('肚子疼了吧')
16             elif arg == 'ku':
17                 #增加功能1
18                 print('告诉你一个不行的消息')
19                 # 调用基本函数
20                 func()
21                 #增加功能2
22                 print('没事,节哀顺变~')
23         #返回内部函数
24         return inner
25     #-----------------end---------------------------
26     #返回装饰器
27     return decor
28 #基本函数1
29 @outer('xiao')#@outer('xiao') ->@decor     #@函数
30 def smile():
31     print('哈哈哈哈哈~')
32 
33 #基本函数2
34 @outer('ku')#@outer('ku')  ->@decor #@函数
35 def cry():
36     print('呜呜呜呜~')
37 #调用smile
38 #smile()
39 '''
40 输出结果:
41 我给你将一个笑话
42 哈哈哈哈哈~
43 肚子疼了吧
44 '''
45 #调用cry
46 cry()
47 '''
48 输出结果:
49 告诉你一个不行的消息
50 呜呜呜呜~
51 没事,节哀顺变~
52 '''

 

第八步: 将类作为参数传入装饰器中使用
 1 #第八步: 将类作为参数传入装饰器中使用
 2 #存在一个类,类中的方法是需要装饰的功能
 3 class Parent:
 4     #成员方法
 5     #抱抱
 6     def baobao():
 7         print('抱抱')
 8     #举高高
 9     def jugaogao():
10         print('举高高')
11 #装饰器外层
12 def outer(cls):
13     #装饰器
14     def decor(func):
15         #定义内部函数
16         def inner():
17             #增加功能
18             cls.baobao()
19             #基本函数
20             func()
21             #增加功能2
22             cls.jugaogao()
23         #返回内部函数
24         return inner
25     #返回装饰器
26     return decor
27 #基本函数
28 #@函数(类)  ->@装饰器
29 @outer(Parent)
30 def love():
31     print('亲亲')
32 #调用函数
33 love()
34 '''
35 输出结果:
36 抱抱
37 亲亲
38 举高高
39 '''

 

第九步  将类作为装饰器 (用类做装饰器)
 1 #第九步  将类作为装饰器 (用类做装饰器)
 2 #定义装饰器
 3 #装饰器外层
 4 def outer(arg):
 5     #装饰器
 6     def decor(func):
 7         #内部函数
 8         def inner():
 9             #增加功能
10             print('抱抱')
11             #基本函数
12             func()
13             #增加功能2
14             print('举高高')
15         #返回函数
16         return inner
17     #返回装饰器
18     return decor
19 #定义类作为装饰器
20 '''
21 1.可以带有区分或者使用的参数arg
22 2.具有接受基本函数传入的参数func
23 3.定义未来的函数 inner
24 '''
25 class Outer:
26     #初始化魔术方法
27     def __init__(self,arg): #相当与outer函数
28         #接受的参数为了其他成员方法可以使用  存入对象中
29         self.arg = arg
30     #一定要具有__call__魔术方法使得对象可以当作函数使用
31     def __call__(self,func):#[这是装饰器的本体 相当于 decor函数]
32         #将call接受的参数func 存入对象
33         self.func = func
34         #返回内部函数inner
35         return self.inner
36     # 定义内部函数inner
37     #将inner作为类的方法存在
38     def inner(self):
39         # 增加功能
40         print('抱抱')
41         # 基本功能
42         self.func()
43         # 增加功能2
44         print('举高高')
45 #基本函数
46 @Outer('ai') #@类() ->#@对象【对象可以当作函数使用】
47 def love():
48     print('亲亲')
49 #调用函数
50 love()
51 '''
52 输出结果:
53 抱抱
54 亲亲
55 举高高
56 '''

 

第十步 为类添加装饰器


 1 #第十步 为类添加装饰器
 2 #定义装饰器
 3 def decor(cls):
 4     #定义内部信息(相当于原来的inner)
 5     def inner():
 6         #产生Human类的对象 [相当于基本功能]
 7         obj = cls()
 8         #添加内容 【相当于增加功能】
 9         obj.age = 1
10         obj.sex = 'man'
11         #返回对象
12         return obj
13     #返回inner函数
14     return inner
15 #定义基本类
16 @decor
17 class Human:
18     pass
19 #使用类  实例化对象
20 ren = Human() #相当于调用Human函数 得到了一个结果【对象】
21 print(ren)
22 #输出结果:<__main__.Human object at 0x0000026550972F28>
23 print(ren.__dict__)
24 #输出结果:{'age': 1, 'sex': 'man'}

第十一步: 多层装饰器嵌套

 1 #第十一步: 多层装饰器嵌套
 2 #定义装饰器1
 3 def decor1(func):
 4     #定义内部函数
 5     def inner():
 6         #增加功能1
 7         print('抱抱')
 8         #调用基本功能
 9         func()
10         #增加功能2
11         print('举高高')
12     #返回内部函数
13     return inner
14 #定义装饰器2
15 def decor2(func):
16     #定义内部函数
17     def inner():
18         #增加功能
19         print('转转')
20         #基本功能
21         func()
22         #增加功能2
23         print('笑一笑')
24     #返回内部函数
25     return inner
26 
27 #定义基本函数
28 @decor2
29 @decor1
30 def love():
31     print('亲亲')
32 #调用函数
33 love()
34 '''
35 输出结果:
36 转转
37 抱抱
38 亲亲
39 举高高
40 笑一笑
41 '''

 

 

 

posted @ 2019-05-16 13:31  双伟科技  阅读(259)  评论(0编辑  收藏  举报