自学Python之路-Python基础+模块+面向对象
自学Python之路-Python网络编程自学Python之路-Python并发编程+数据库+前端自学Python之路-django

自学Python4.4 - 装饰器的进阶

  • 1. functools.wraps
  • 2. 带参数的装饰器
  • 3. 多个装饰器装饰同一个函数

1. functools.wraps

对于装饰器我们都知道它主要的功能是:在不改变被装饰的函数及被装饰的函数的执行方式下,给函数增加额外功能的函数,但是我们在查看一个函数的注释和函数名的时候,如果这个函数带有装饰器,那么我们看到是注释信息和函数名就是装饰器里面的信息,而不是原来函数的信息,那么如何解决,实例如下:

from functools import wraps
def wrapper(func): #func = holiday
@wraps(func)
def inner(*args,**kwargs):
print('在被装饰的函数执行之前做的事')
ret = func(*args,**kwargs)
print('在被装饰的函数执行之后做的事')
return ret
return inner @wrapper #holiday = wrapper(holiday)
def holiday(day):
'''这是一个放假通知'''
print('全体放假%s天'%day)
return '好开心' print(holiday.__name__)
print(holiday.__doc__)
ret = holiday(3) #inner
print(ret)

2. 带参数的装饰器

假如你们公司有300个函数使用了同一个装饰器,现在那领导让你把这些装饰器全部取消掉,你该怎么做? 

使用最笨的办法一个一个添加?这样的话需要添加多长时间?然后几天之后领导说再把那些装饰器加上吧,你什么思想?那这个时候就可以用到带有参数的装饰器:

import time
FLAGE = False
def timmer_out(flag):
def timmer(func):
def inner(*args,**kwargs):
if flag:
start = time.time()
ret = func(*args,**kwargs)
end = time.time()
print(end-start)
return ret
else:
ret = func(*args, **kwargs)
return ret
return inner
return timmer
# timmer = timmer_out(FLAGE)
@timmer_out(FLAGE) #wahaha = timmer(wahaha)
def wahaha():
time.sleep(0.1)
print('wahahahahahaha') @timmer_out(FLAGE)
def erguotou():
time.sleep(0.1)
print('erguotoutoutou') wahaha()
erguotou()

3. 多个装饰器装饰同一个函数

在实际生产中,有的时候可能会用到多个装饰器来装饰同一个函数,下面我们就来说一下多个装饰器在装饰同一个函数具体的过程,实例如下:

def wrapper1(func):
def inner1():
print('wrapper1 ,before func')
ret = func()
print('wrapper1 ,after func')
return ret
return inner1 def wrapper2(func):
def inner2():
print('wrapper2 ,before func')
ret = func()
print('wrapper2 ,after func')
return ret
return inner2 def wrapper3(func):
def inner3():
print('wrapper3 ,before func')
ret = func()
print('wrapper3 ,after func')
return ret
return inner3 @wrapper3
@wrapper2
@wrapper1
def f():
print('in f')
return '哈哈哈' print(f())

自学Python4.4-装饰器的进阶的更多相关文章

  1. 自学Python4.5-装饰器举例

    自学Python之路-Python基础+模块+面向对象自学Python之路-Python网络编程自学Python之路-Python并发编程+数据库+前端自学Python之路-django 自学Pyth ...

  2. 自学Python4.2-装饰器

    自学Python之路-Python基础+模块+面向对象自学Python之路-Python网络编程自学Python之路-Python并发编程+数据库+前端自学Python之路-django 自学Pyth ...

  3. 自学Python4.3-装饰器固定格式

    自学Python之路-Python基础+模块+面向对象自学Python之路-Python网络编程自学Python之路-Python并发编程+数据库+前端自学Python之路-django 自学Pyth ...

  4. python基础(8)-装饰器函数&进阶

    从小例子进入装饰器 统计一个函数执行耗时 原始版本 import time # time模块有提供时间相关函数 def do_something(): print("do_something ...

  5. 洗礼灵魂,修炼python(30)--装饰器(2)—>装饰器总结+进阶使用

    在上一篇博文的经典案例中,我想你应该对装饰器有很好的了解了,不过光有那些还不够真的,还需要总结和进阶一下,所以本篇博文解析装饰器进阶. 装饰器 1.什么是装饰器? 个人理解:装饰器又叫语法糖,指的是对 ...

  6. day12:装饰器的进阶

    1,三元运算符:变量 = 条件返回True的结果 if 条件 else 条件返回false的结果:必须要有结果:必须要有if和else,只能是简单的情况. 2,传参包起来,星号打散 def outer ...

  7. python之路第五篇之装饰器:(进阶篇)

    装饰器: 学前必备知识: def f1(): print "f1" f1() #表示函数执行 f1 #表示函数,指向内存地址 f1 = lambda x: x + 1 f1() # ...

  8. Python装饰器的进阶

    带参数的装饰器 示例一:Python自带的装饰器函数 from functools import wraps import time def Time(func1): @wraps(func1) de ...

  9. 自学Python4.6-迭代器

    自学Python之路-Python基础+模块+面向对象自学Python之路-Python网络编程自学Python之路-Python并发编程+数据库+前端自学Python之路-django 自学Pyth ...

随机推荐

  1. JEECG & JEESite Tomcat集群 Session共享

    多台tomcat服务的session共享 memcached与redis - JEECG开源社区 - CSDN博客https://blog.csdn.net/zhangdaiscott/article ...

  2. 网站之robots.txt文件

    一.robots.txt是什么?   robots.txt是一个纯文本文件,在这个文件中网站管理者可以声明该网站中不想被搜索引擎访问的部分,或者指定搜索引擎只收录指定的内容. 当一个搜索引擎(又称搜索 ...

  3. JS—ajax及async和defer的区别

    ###1.ajax  “Asynchronous Javascript And XML”(异步 JavaScript 和 XML) 使用: 如不考虑旧版本浏览器兼容性, // 第一步创建xhr对象 v ...

  4. [转帖]关于CP936

    来源: 知乎:https://www.zhihu.com/question/35609295/answer/63780022 CP936和UTF-8本身和Python是毫无关联的. CP936其实就是 ...

  5. [转帖]pfSense软路由系统的使用

    图解pfSense软路由系统的使用(NAT功能) http://seanlook.com/2015/04/23/pfsense-usage/  发表于 2015-04-23 |  更新于: 2015- ...

  6. 用stringstream可以用来分割空格、tab、回车换行隔开的字符串:

    #include <iostream> #include <sstream> #include <vector> using namespace std; int ...

  7. 使用mysqlbinlog恢复数据

    前提:mysql数据库开启了binlog日志,并且有对应的日志文件 起因:今天由于同事对数据库的误操作不小心删除了一条数据 方法一:通过binlog日志文件恢复数据 通过mysqlbinlog恢复My ...

  8. DELPHI中MDI子窗口的关闭和打开

    DELPHI中MDI子窗口的关闭 和打开       Delphi中MDI子窗口的关闭方式默认为缩小而不是关闭,所以当你单击子窗口右上角的关闭按钮时会   发觉该子窗口只是最小化,而不是你预期的那样被 ...

  9. vue的 v-for 循环中图片加载路径问题

    先看一下产品需求,如下图所示, 产品要求图片和它的名称一一对应,本来是非常简单的需求,后台直接返回图片路径和名称,前台直接读取就可以了,但是我们没有存储图片的服务器,再加上是一个实验性的需求,图片需要 ...

  10. 洛谷 P1160 队列安排

    题目描述 一个学校里老师要将班上 NNN 个同学排成一列,同学被编号为 $1-N$ ,他采取如下的方法: 先将 111 号同学安排进队列,这时队列中只有他一个人: 2−N2-N2−N 号同学依次入列, ...