Python中函数装饰器及练习

1)装饰器的理解:

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

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

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

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

2)无参函数装饰器

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

   

   执行结果为:

   

3)有参函数装饰器

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

   

4)装饰器练习

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

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 2 3 4 5 6 7 8 9 @getTime def join_add():    # 使用内置函数join来连接 print ','.join(li) return 1 print con_add()    # 进行调用 print join_add() 显示结果如下:由此可见,使用内置函数运行时间小于普通函数。    注意:一、当被装饰函数有返回值的时候:我们需要在装饰函数里面,对被装饰函数调用进行接收;然后返回接收值就可以显示被装饰函数的返回值了!       二、如何保留被装饰函数的函数名和帮助文档信息:导入functools包,并进行调用即可 2、记录日志:打印的日志格式为:【字符串时间】 函数名: xx 运行时间:xx 运行返回值:xx 10 11 12 13 14 15 16 17  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+Log(1,2.2) 18 19 20 21  显示运行结果:   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 "写博客..." 22 23 24 25 26 27 28 29  def login(): return "登陆..." print writeBlog(name = 'admin')      # 此用户可以登陆;执行结果为'写博客...' 30 31 32 33  注释:一个函数,可以有多个装饰器来修饰 4、函数参数认证:  1)、当装饰器为@required_type(int,float):确保函数接受到的每一个参数为int或float  2)、当装饰器参数为list,确保每一个参数类型均为list类  3)、当参数为(str,int):确保函数接受到的每一个参数为str或int  4)、类型若以上参数均不满足,打印TypeError:参数必须是xxx  import functools 34 35 36 37 38 39 40 41   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)
点赞
收藏

评论区

加载中...

相关推荐

Oracle 分组与拼接字符串同时使用

SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(

皕杰报表之UUID

​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为

手写Java HashMap源码

HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22

Python基础5——装饰器

13、装饰器其本质:在不需要做任何代码变动的前提下,增加额外的功能。装饰器返回的是一个函数对象。相当于把函数作为参数传递进去,然后对函数进行装饰其本质就是一个闭包作用:1.给原来的函数增加额外的功能2.把原来的函数作为参数传递进去13.1基本用法标准版的装饰器pythondefwrapper(func):func为原来的函数名defin

恶补了 Python 装饰器的六种写法,你随便问~

大家好,我是明哥。今天给大家分享一下关于装饰器的知识点,内容非常干,全程高能,认真吸收看完,一定会对装饰器有更深的理解。Hello,装饰器装饰器本质上是一个Python函数,它可以让其他函数在不需要做任何代码变动的前提下增加额外功能,装饰器的返回值也是一个函数对象。它经常用于有切面需求的场景,比如:插入日志、性能测试、事务处理、缓存、权限校验等场景。装饰

浅析装饰器的那些事儿

一、装饰器的简单定义外层函数返回里层函数的引用,里层函数引用外层函数的变量。二、装饰器的作用通俗来讲装饰器的作用就是在不改变已有函数代码前提下,为该函数增加新的功能。defrun():print('我会跑')fun()现在我想在原有函数的基础上新增一个功能:我会唱歌。这个时候利用装饰器则轻松可以帮我们实现这个功能。三、实例理解(1)不