面向对象-装饰器
装饰器是什么?
为了增加功能而对函数或者类进行功能扩充的一种语法。
第一步:声明一个普通函数即可
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 '''