python装饰器的一些高级用法

一、 概述
本文简单介绍装饰设计模式的原理,及python3装饰器的下面几个实现
1. python函数装饰器
2. 带参数装饰
3. 一个方法的多次装饰
4. 类装饰器
二、 装饰器原理
python装饰器,就是设计模式中的装饰设计模式,属于结构类设计模式,具体内容是
对一个人、事、物进行点缀,这每一次点缀便是一次装饰,基本前提条件是不能破坏原有对象的结构。例如
1、 对一位年轻男人进行装饰
可以将这位年轻男人装扮为女人,这次装扮过程,便是一次装饰模式实现
可以将这位年轻男人装扮为老头,这次也是一次装饰模式实现
。。。
这里的基本条件是不能对这位年轻男人做任何手术的改变,即不能改变原有对象的结构。
2、 对一位学生高考成绩进行装饰
假设这位学生的高考成绩为680分,有下面几次装饰
1) 第1次装饰
全班50名学生,他排第40名,哦,不怎么样呢,可能会受到家长批评
2) 第2次装饰
全年级5000名学生,他排第40名,哇,还成哦,家长感觉一般般
3) 第3次装饰
全班50名学生,全部考上了清华、北大,哇,原来好牛呢,家长心里老高兴呢
上面无论进行怎样的装饰,就是不能修改学生姓名与考试分数,但可以对这个考分的进行各种解释,这每一次解释,便是一次装饰。

三、 装饰模式的简单实现示例
1、 编写要点
1>写一个装饰器函数
闭函数
无装饰参数时,是两个return返回
有装饰参数时,是三个return返回

2> 写一个原始函数
函数可以有多个参数
函数上面加入注解,即装饰实现
注解装饰可能有多个参数
3>调用函数
即自动实现装饰器
2、 完整示例如下


def decorator1(fun1):
        def decfun(*args):
              print("给穿上女人的衣服。。。")
              result=fun1(*args)
              print("装扮成女人完毕。。。")
              return result
        return decfun 

@decorator1
def myfun(name,age):
      print("myfun,这是真实的我,我是年轻男人。。。")
      return 'name=%s,age=%d'%(name,age)

s1=myfun('张小东',22)  
print(s1)   
'''
输出如下-->
给穿上女人的衣服。。。
myfun,这是真实的我,我是年轻男人。。。
装扮成女人完毕。。。
name=张小东,age=22

四、 一个函数多次装饰
1、 实现需求
即前面的学生成绩作多次装饰
2、 编程要点
1) 写一个班级排名装饰函数
有一个装饰参数, 班的排名
2) 写一个年级排名装饰函数
有一个装饰参数,年级排名
3) 写一个招生结果装饰函数
有一个装饰参数,考上的大学名称
4) 写一个原始任务类函数
有2个参数,学生姓名,高考分数
有3个装饰注解实现
3、 示例代码如下


#班排名装饰
def classOrder(num,tonum):
   def dec1(func):
        def decfun(*args):
              print("班排名装饰,第 %d 名,全班共有(%d)人"%(num,tonum))
              result=func(*args)
              print("班排名装饰完毕。。。")
              return result
        return decfun 
   return dec1


#年级排名装饰
def gradeOrder(num,tonum):
   def dec2(func):
        def decfun(*args):
              print("年级排名装饰,年级第( %d )名,全年级共(%d)人"%num,tonum))
              result=func(*args)
              print("年级排名装饰完毕。。。")
              return result
        return decfun 
   return dec2

#高考录取装饰
def UniResult(name):
   def dec3(func):
        def decfun(*args):
              print("高考录取装饰,大学是:%s"%name)
              result=func(*args)
              print("高考录取装饰完毕。。。")
              return result
        return decfun 
   return dec3

@classOrder(40,50)
@gradeOrder(40,5000)
@UniResult('清华大学')
def studScore(name,score):
      print('\n原始内容是,学生姓名:%s,高考成绩:%.2f\n'%(name,score))


studScore('张小龙',685.68456)  
'''
输出结果是--->
班排名装饰,第 40 名,全班共有(50)人
年级排名装饰,年级第( 40 )名,全年级共(5000)人
高考录取装饰,大学是:清华大学

原始内容是,学生姓名:张小龙,高考成绩:685.68

高考录取装饰完毕。。。
年级排名装饰完毕。。。
班排名装饰完毕。。。

'''  

五、 类装饰
1、 实现需求
可以写一个类,在类的方法上面进行装饰
效果与写在外面函数是一样的
2、 示例如下


class StudScore:
      clsOrder1=20
      def __init__(self,name,score):
            self.name=name
            self.score=score


      @classOrder(40,50)
      @gradeOrder(40,5000)
      @UniResult('清华大学')         
      def out(self):
          print('\n原始内容是,学生姓名:%s,
高考成绩:%.2f\n'%(self.name,self.score))

s1=StudScore('王海燕',670.4567)      
s1.out()    
'''
输出如下
班排名装饰,第 40 名,全班共有(50)人
年级排名装饰,年级第( 40 )名,全年级共(5000)人
高考录取装饰,大学是:清华大学

原始内容是,学生姓名:王海燕,高考成绩:670.46

高考录取装饰完毕。。。
年级排名装饰完毕。。。
班排名装饰完毕。。。

'''

created by 刘明
这里写图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值