Python中函数装饰器及练习

Stella981
• 阅读 562

1)装饰器的理解:

1、作用:在不改变原函数的基础上,给函数增加功能

    2、返回值:把一个函数当作参数,返回一个替代版的函数

3、本质:返回函数的函数

4、应用场景:计时器、记录日志、用户登陆认证、函数参数认证

2)无参函数装饰器

    实例: 被装饰的函数没有参数

   

   执行结果为:

   

3)有参函数装饰器

    实例:当年龄小于0时,均输出0

   

4)装饰器练习

1、定时器(获取每个函数的执行时间)  

 import time import string import random import functools # 随机生成24个大小写英文字母 li = [random.choice(string.ascii_letters) for i in range(24)] def getTime(fun):    @functools.wraps(fun)    def wrapper(*args, **kwargs):        start_time = time.time()        rest = fun(*args,**kwargs)        end_time = time.time()        print "函数运行时间为:%.6f" %(end_time-start_time)        return rest    return wrapper   @getTime def con_add():      # 使用+来连接    sum = " "    for i in li:        sum += (i+',')    print sum    return 0

   
   
   
 
    
    
     @getTime def join_add():    # 使用内置函数join来连接    print ','.join(li)    return 1 print con_add()    # 进行调用 print join_add() 显示结果如下:由此可见,使用内置函数运行时间小于普通函数。    注意:一、当被装饰函数有返回值的时候:我们需要在装饰函数里面,对被装饰函数调用进行接收;然后返回接收值就可以显示被装饰函数的返回值了!       二、如何保留被装饰函数的函数名和帮助文档信息:导入functools包,并进行调用即可 2、记录日志:打印的日志格式为:【字符串时间】 函数名: xx 运行时间:xx 运行返回值:xx  
    
       
       
       
     
        
        
         import time import functools def add_log(fun):     @functools.wraps(fun)     def wrapper(*args,**kwargs):         start_time = time.time()         ret = fun(*args,**kwargs)         end_time = time.time()         print '[%s] 函数名:%s 运行时间:%.6s 运行的返回值的结果:%d' \         %(time.ctime(),fun.__name__,end_time-start_time,ret)     return wrapper @add_log def Log(x,y):     time.sleep(1)     return x+y Log(1,2.2)
    
       
       
        显示运行结果:   3、验证用户的登陆认证(登陆成功执行被装饰函数;失败继续执行登陆) import functools login_user = ['admin', 'root'] def is_login(fun):    @functools.wraps(fun)    def wrapper(*args, **kwargs):  # 可以使用第一个元组值来判断       if kwargs.get('name') in login_user:                     res = fun(*args, **kwargs)          return res               else:                      res = login()            return res    return wrapper @is_login def writeBlog(name):    return "写博客..."
   
      
      
      
    
       
       
        def login():    return "登陆..." print  writeBlog(name = 'admin')      # 此用户可以登陆;执行结果为'写博客...'
   
      
      
       注释:一个函数,可以有多个装饰器来修饰 4、函数参数认证:  1)、当装饰器为@required_type(int,float):确保函数接受到的每一个参数为int或float  2)、当装饰器参数为list,确保每一个参数类型均为list类  3)、当参数为(str,int):确保函数接受到的每一个参数为str或int  4)、类型若以上参数均不满足,打印TypeError:参数必须是xxx  import functools
   
      
      
      
    
       
       
         def required_type(*type):     def required_all(fun):         @functools.wraps(fun)         def wrapper(*args, **kwargs):             for i in args:                 if isinstance(i, type):                     pass                 else:                     print 'typeError:函数所有的参数并非', type                     break             else:                 res = fun(*args, **kwargs)                 return res         return wrapper     return required_all  @required_type(list)  def add(a, b):     return a + b  print add([1,2],2)
点赞
收藏
评论区
推荐文章
blmius blmius
3年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
半臻 半臻
3年前
Python基础5——装饰器
13、装饰器其本质:在不需要做任何代码变动的前提下,增加额外的功能。装饰器返回的是一个函数对象。相当于把函数作为参数传递进去,然后对函数进行装饰其本质就是一个闭包作用:1.给原来的函数增加额外的功能2.把原来的函数作为参数传递进去13.1基本用法标准版的装饰器pythondefwrapper(func):func为原来的函数名defin
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
Irene181 Irene181
3年前
恶补了 Python 装饰器的六种写法,你随便问~
大家好,我是明哥。今天给大家分享一下关于装饰器的知识点,内容非常干,全程高能,认真吸收看完,一定会对装饰器有更深的理解。Hello,装饰器装饰器本质上是一个Python函数,它可以让其他函数在不需要做任何代码变动的前提下增加额外功能,装饰器的返回值也是一个函数对象。它经常用于有切面需求的场景,比如:插入日志、性能测试、事务处理、缓存、权限校验等场景。装饰
Karen110 Karen110
3年前
浅析装饰器的那些事儿
一、装饰器的简单定义外层函数返回里层函数的引用,里层函数引用外层函数的变量。二、装饰器的作用通俗来讲装饰器的作用就是在不改变已有函数代码前提下,为该函数增加新的功能。defrun():print('我会跑')fun()现在我想在原有函数的基础上新增一个功能:我会唱歌。这个时候利用装饰器则轻松可以帮我们实现这个功能。三、实例理解(1)不
Python进阶者 Python进阶者
3年前
浅析装饰器的那些事儿
一、装饰器的简单定义外层函数返回里层函数的引用,里层函数引用外层函数的变量。二、装饰器的作用通俗来讲装饰器的作用就是在不改变已有函数代码前提下,为该函数增加新的功能。defrun():print('我会跑')fun()现在我想在原有函数的基础上新增一个功能:我会唱歌。这个时候利用装饰器则轻松可以帮我们实现这个功能。三、实
Stella981 Stella981
3年前
JS 对象数组Array 根据对象object key的值排序sort,很风骚哦
有个js对象数组varary\{id:1,name:"b"},{id:2,name:"b"}\需求是根据name或者id的值来排序,这里有个风骚的函数函数定义:function keysrt(key,desc) {  return function(a,b){    return desc ? ~~(ak
Stella981 Stella981
3年前
HIVE 时间操作函数
日期函数UNIX时间戳转日期函数: from\_unixtime语法:   from\_unixtime(bigint unixtime\, string format\)返回值: string说明: 转化UNIX时间戳(从19700101 00:00:00 UTC到指定时间的秒数)到当前时区的时间格式举例:hive   selec
Stella981 Stella981
3年前
Python 装饰器(Decorator)
Python 装饰器(Decorator)装饰模式有很多经典的使用场景,例如插入日志、性能测试、事务处理等等,有了装饰器,就可以提取大量函数中与本身功能无关的类似代码,从而达到代码重用的目的。下面就一步步看看Python中的装饰器。装饰器本身是一个Python函数,他可以让其他函数在不需要做任何代码变动
Stella981 Stella981
3年前
Python装饰器用法实例总结
一、装饰器是什么python的装饰器本质上是一个Python函数,它可以让其他函数在不需要做任何代码变动的前提下增加额外功能,装饰器的返回值也是一个函数对象。简单的说装饰器就是一个用来返回函数的函数。它经常用于有切面需求的场景,比如:插入日志、性能测试、事务处理、缓存、权限校验等场景。装饰器是解决这类问题的绝佳设计,有了装饰器,我们就可以抽离