一、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. windows服务器运维日常--防火墙打开后ping不通

    1. 打开防火墙,有利于安全 2. 添加80端口,支持互联网访问:添加3389端口,以支持远程桌面连接 3. 发现开了防火墙之后,ping不通网址www.mjywxy.xin 4. 查找资料和测试发现 ...

  2. HDU 5912 Fraction(模拟)

    Problem Description Mr. Frog recently studied how to add two fractions up, and he came up with an ev ...

  3. setTimeout第三个参数

    在廖雪峰大神的官方网站看nodejs的时候,发现自己对Promise函数不甚了解,于是转去看Promise函数,看到了这段代码: function multiply(input) { return n ...

  4. VUE框架思想

    学习VUE的第一步就是先了解这个框架的的核心思想 Vue.js的核心思想就是,它是一套__渐进式的自底层向上增量开发__的__MVVM__结构的框架 什么是框架? 简单的讲,框架就是将与业务无关的重复 ...

  5. node-sass安装报错

    npm install --save-dev node-sass --registry=https://registry.npm.taobao.org --disturl=https://npm.ta ...

  6. HDU5618 Jam's problem again CDQ分治

    Jam's problem again CDQ分治 传送门:http://acm.hdu.edu.cn/showproblem.php?pid=5618 题意: \[ 有n 个元素,第 i 个元素有 ...

  7. Qt中动态链接库的使用

    转自: http://www.qtcn.org/bbs/read.php?tid=14719 现在有些软件有自动升级功能,有些就是下载新的DLL文件,替换原来的动态链接库.MFC好象也有类似机制 Qt ...

  8. Wannafly挑战赛25 因子 [数论]

    一.题意 令 X = n!, 给定一大于1的正整数p 求一个k使得 p ^k | X 并且 p ^(k + 1) 不是X的因子 输入为两个数n, p (1e18>= n>= 10000 & ...

  9. 如何删除Word自动编号后文字和编号之间的空白距离

    一.出现的现象:使用word进行自动编号之后,编号和其后的文字出现如下图所示的空白 二.如何解决问题 选中列表内容右键->调整列表缩进->选择“编号之后(W)"为不特别标注-&g ...

  10. Mysql 最全查询语句

    基本查询语句及语法: select distinct from where group by having limit 一.单表查询 前期表与数据准备: # 创建一张部门表 create table ...