一、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. P1081 弹珠游戏

    题目出处 灵灵和他的小伙伴聪聪发掘了一个骨灰级别的游戏--超级弹珠. 游戏的内容是:在一个 n*n 的矩阵里,有若干个敌人,你的弹珠可以摧毁敌人,但只能攻击你所在的行.列里的所有敌人,然后你就可以获得 ...

  2. Callable Objects

    We learned in 7.11 that there are "array-like" objects that are not true arrays but can be ...

  3. Python3使用过程中需要注意的点

    命名规则 变量 变量名只能是数字.字母或下划线的任意组合 变量名的第一个字符不能是数字 不能使用关键字作为变量名 变量的定义要具有可描述性 变量名不宜过长.不宜使用中文.拼音 常量(常用在配置文件中) ...

  4. JavaSE基础---多线程

    进程:正在进行的程序.其实就是一个应用程序运行时的内存分配空间. 线程:进程中一个程序执行控制单元,一条执行路径.进程负责的事应用程序的空间的标识,线程负责的事应用程序的执行顺序. 进程和线程的关系: ...

  5. You are using the runtime-only build of Vue where the template compiler is not available. Either pre-compile the templates into render functions, or use the compiler-included build.

    异常 You are using the runtime-only build of Vue where the template compiler is not available. Either ...

  6. springboot中redis做缓存时的配置

    import com.google.common.collect.ImmutableMap;import org.slf4j.Logger;import org.slf4j.LoggerFactory ...

  7. LabWindows/CVI基础

    1.LabWindows/CVI了解 提到NI公司,大家可能最先联想到的是NI公司推出的LabVIEW软件.LabWindows/CVI与LabVIEW相比,主要应用在各种测试.控制.故障分析及信息处 ...

  8. PyTorch深度学习:60分钟入门(Translation)

    这是https://zhuanlan.zhihu.com/p/25572330的学习笔记. Tensors Tensors和numpy中的ndarrays较为相似, 因此Tensor也能够使用GPU来 ...

  9. 如何使用JMX来管理程序?

    什么是JMX JMX,全称Java Management Extensions,用于我们管理和监控java应用程序.JMX有以下用途: 监控应用程序的运行状态和相关统计信息. 修改应用程序的配置(无需 ...

  10. JAVA优化篇 如何找到运行缓慢的线程

    引入 JAVA提供了一些分析DUMP的工具,比如jmap,visualvm 等 JAVA还有寻找线程状态的工具,jstack等 数据库也有检查连接数,连接状态的命令,status,processlis ...