一、wraps

作用:优化装饰器

from functools import wraps     # 导入wraps

def wrapper(f):
@wraps(f) # wraps的语法糖
def inner(*args, **kwargs):
ret = f(*args, **kwargs)
return ret
return inner @wrapper
def f1():
print("Hello, World!")
return 'Hi' res = f1()
print(res)
print(f1.__name__) # 查看字符串格式的函数名,打印的函数名inner->f1

二、带参数的装饰器

实质:嵌套调用,三层嵌套函数

from functools import wraps
import time
flag = True def wrapper_out(is_flage):
def wrapper(func):
"""
flag为True时函数被装饰器装饰
flag为FLASE时函数正常被调用
:param func:
:return:
"""
@wraps(func)
def inner(*args, **kwargs): # 聚合
if is_flage:
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 wrapper @wrapper_out(flag) # @wrapper_out()->@wrapper->f1=wrapper(f1) 调用wrapper_out(flag)函数,return wrapper
def f1():
time.sleep(1)
print("Hello, World")
return 'joker' ret = f1()
print(ret)

三、多个装饰器装饰一个函数

from functools import wraps

def wrapper1(func):     # func->f1
@wraps(func)
def inner1(*args, **kwargs):
print("wrapper1,before") #
ret = func(*args, **kwargs) # 3, f1()
print("wrapper1,after") #
return ret # ret is f1()的返回值,现在是执行inner1()的返回值
return inner1 def wrapper2(func): # func->inner1
@wraps(func)
def inner2(*args, **kwargs):
print("wrapper2,before") #
ret = func(*args, **kwargs) # inner1()
print("wrapper2,after") # 5, 执行完inner1()
return ret # ret is inner1()的返回值即f1()的返回值,现在是执行inner2()的返回值
return inner2 @wrapper2 # f1=wrapper2(inner1)
@wrapper1 # f1=wrapper1(f1)->f1=inner1
def f1(a):
print("Hello")
return a """
f1指向inner2的内存地址,f1()->inner2(),f1()的返回值是inner2()的返回值,也就是f1()函数自身的返回值
"""
ret = f1(2)
print(ret)
"""
结果:
wrapper2,before
wrapper1,before
Hello
wrapper1,after
wrapper2,after
2
"""

现象:

 

python3装饰器-进阶的更多相关文章

  1. Python函数--装饰器进阶

    开放封闭原则 1.对扩展是开放的 为什么要对扩展开放呢? 我们说,任何一个程序,不可能在设计之初就已经想好了所有的功能并且未来不做任何更新和修改.所以我们必须允许代码扩展.添加新功能. 2.对修改是封 ...

  2. day 12 - 1 装饰器进阶

    装饰器进阶 装饰器的简单回顾 装饰器开发原则:开放封闭原则装饰器的作用:在不改变原函数的调用方式的情况下,在函数的前后添加功能装饰器的本质:闭包函数 装饰器的模式 def wrapper(func): ...

  3. Python装饰器进阶

    装饰器进阶 现在,我们已经明白了装饰器的原理.接下来,我们还有很多事情需要搞清楚.比如:装饰带参数的函数.多个装饰器同时装饰一个函数.带参数的装饰器和类装饰器. 装饰带参数函数 def foo(fun ...

  4. day4之装饰器进阶、生成器迭代器

    装饰器进阶 带参数的装饰器 # 某一种情况# 500个函数加装饰器, 加完后不想再加这个装饰器, 再过一个季度,又想加上去# 你可以设计你的装饰器,来确认是否执行 # 第一种情况 # 想要500个函数 ...

  5. (转)python装饰器进阶一

    Python装饰器进阶之一 先看例子 网上有很多装饰器的文章,上来说半天也没让人看明白装饰器到底是个什么,究竟有什么用,我们直接来看几个例子. Python递归求斐波那契数列 def fibonacc ...

  6. 净心诀---python3装饰器

    python3装饰器 装饰器作用 简单理解:可以为已有函数添加额外功能 例: 已有2个函数如下 def MyFunc1(): print("This is a print function1 ...

  7. python3 装饰器应用举例

    [引子] python 中的装饰器是oop(面向对象编程)设计模式.之装饰器模式的一个应用.由于有语法糖衣的缘故.所以写起来也更加方便 [从一个比较经典的应用场景来讲解装饰器] 有过一定编程经历的工程 ...

  8. python3 装饰器全解

    本章结构: 1.理解装饰器的前提准备 2.装饰器:无参/带参的被装饰函数,无参/带参的装饰函数 3.装饰器的缺点 4.python3的内置装饰器 5.本文参考 理解装饰器的前提:1.所有东西都是对象( ...

  9. 从入门到自闭之python三大器--装饰器进阶

    装饰器的进阶 有参装饰器: # def warpper(func): # def inner(*args,**kwargs): # user = input("user:") # ...

随机推荐

  1. Jmeter压力测试教程(入门篇)

    2.4 添加HTTP镜像服务器 在运行测试之前,如何验证我们发送的信息是否有误?如何可以理直气壮的告诉别人自己发送的测试请求没有问题?这里推荐添加HTTP镜像服务器进行校验测试. HTTP镜像服务器并 ...

  2. 2018-10-19-jekyll-添加-Valine-评论

    title author date CreateTime categories jekyll 添加 Valine 评论 lindexi 2018-10-19 09:10:40 +0800 2018-2 ...

  3. Linux 内核设备驱动

    设备模型跟踪所有对系统已知的驱动. 这个跟踪的主要原因是使驱动核心能匹配驱动和新 设备. 一旦驱动在系统中是已知的对象, 但是, 许多其他的事情变得有可能. 设备驱动可 输出和任何特定设备无关的信息和 ...

  4. Linux 内核端点

    USB 通讯的最基本形式是通过某些称为 端点 的. 一个 USB 端点只能在一个方向承载数 据, 或者从主机到设备(称为输出端点)或者从设备到主机(称为输入端点). 端点可看作一 个单向的管道. 一个 ...

  5. Linux 内核硬件抽象

    我们结束 PCI 的讨论, 通过快速看一下系统如何处理在市场上的多种 PCI 控制器. 这只 是一个信息性的小节, 打算来展示给好奇的读者, 内核的面向对象分布如何向下扩展到最 低层. 用来实现硬件抽 ...

  6. ZR提高失恋测3

    ZR提高失恋测3 题目链接 (感觉这一场比以往的简单了一些) 估分 100 + 40 + 40 得分 100 + 60 + 40 ??? A 首先,我们能够想到一个比较简单的\(n^2\)做法, 枚举 ...

  7. The Zen of Python —— Python 之禅

    Beautiful is better than ugly.   # 优美好于丑陋(Python以编写优美的代码为目标) Explicit is better than implicit.   # 明 ...

  8. BGP团体属性的应用案例

    XRV1 ===================================================================== version 15.5service times ...

  9. lnmp安装部署-mysql5.6+centos6.8+php7.1+nginx1.9

    1.准备工作: 1)把所有的软件安装在/Data/apps/,源码包放在/Data/tgz/,数据放在/Data/data,日志文件放在/Data/logs,项目放在/Data/webapps, mk ...

  10. $Codeforces\ 522D\ Closest\ Equals$ 线段树

    正解:线段树 解题报告: 传送门$QwQ$ 题目大意是说给定一个数列,然后有若干次询问,每次询问一个区间内相同数字之间距离最近是多少$QwQ$.如果不存在相同数字输出-1就成$QwQ$ 考虑先预处理出 ...