wapers方法

def wahaha():
'''
sljfldsjflds
:return:
'''
print('娃哈哈')
print(wahaha.__name__) #查看字符串格式的函数名
from functools import wraps
def wrapper(func): #func = login
@wraps(func)
def innner(*args,**kwargs):
print('在被装饰的函数执行前做的事')
ret = func(*args,**kwargs)
print('在被装饰的函数执行后做的事')
return ret
return innner
@wrapper #login = wrapper(login)
def login(day):
'''这是一个放假通知'''
print('全体放假%s'%day)
return '好开心'
print(login.__name__)
print(login.__doc__)
ret = login(3) #inner
print(ret)

login
这是一个放假通知
在被装饰的函数执行前做的事
全体放假3
在被装饰的函数执行后做的事
好开心

装饰器进阶_带参数的装饰器

import time
FLAG = True
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_out(FLAG)
def wahaha():
time.sleep(0.1)
print('hahahahahaha')
#@timer = timer_out(FLAG)
@timmer_out(FLAG)
def erguotou():
time.sleep(0.2)
print('erguotoutotutou') wahaha()
erguotou()

hahahahahaha
0.1000058650970459
erguotoutotutou
0.2000112533569336

 
import time
FLAG = 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_out(FLAG)
def wahaha():
time.sleep(0.1)
print('hahahahahaha')
#@timer = timer_out(FLAG)
@timmer_out(FLAG)
def erguotou():
time.sleep(0.2)
print('erguotoutotutou') wahaha()
erguotou() hahahahahaha
erguotoutotutou

#多个装饰器装饰一个函数

def wrapper1(func):
def innner1(*args,**kwargs):
print('wrapper,before func')
func()
print('wrapper,after func')
return innner1
def wrapper2(func):
def innner2(*args,**kwargs):
print('wrapper,before func')
func()
print('wrapper,after func')
return innner2
@wrapper2
@wrapper1
def f():
print('##########333')
f() wrapper,before func
wrapper,before func
##########333
wrapper,after func
wrapper,after func
####################################
from functools import wraps
def wrapper1(func): #func --->f
def innner1(*args,**kwargs):
print('wrapper1,before func')
func() #f
print('wrapper1,after func')
return innner1
def wrapper2(func): #func --->inner1
def innner2(*args,**kwargs):
print('wrapper2,before func')
func() #inner1
print('wrapper2,after func')
return innner2
@wrapper2 #f=wrapper2(f) === wrapper(inner1) ===inner2
@wrapper1 #f=wrapper1(f) ==inner1 函数最近的装饰器先执行
def f():
print('##########333')
f() #-----》inner2()
 

三层嵌套

from functools import wraps
def wrapper1(func): #func --->f
def innner1(*args,**kwargs):
print('wrapper1,before func')
func() #f
print('wrapper1,after func')
return innner1
def wrapper2(func): #func --->inner1
def innner2(*args,**kwargs):
print('wrapper2,before func')
func() #inner1
print('wrapper2,after func')
return innner2
def wrapper3(func): #func --->inner1
def innner3(*args,**kwargs):
print('wrapper3,before func')
func() #inner1
print('wrapper3,after func')
return innner3
@wrapper3
@wrapper2 #f=wrapper2(f) === wrapper(inner1) ===inner2
@wrapper1 #f=wrapper1(f) ==inner1 函数最近的装饰器先执行
def f():
print('##########333')
f() #-----》inner2() wrapper3,before func
wrapper2,before func
wrapper1,before func
##########333
wrapper1,after func
wrapper2,after func
wrapper3,after func

带返回值的多装饰器装饰函数

def wrapper1(func):  #func --->f
def innner1(*args,**kwargs):
print('wrapper1,before func')
ret = func() #f
print('wrapper1,after func')
return ret
return innner1
def wrapper2(func): #func --->inner1
def innner2(*args,**kwargs):
print('wrapper2,before func')
ret = func() #inner1
print('wrapper2,after func')
return ret
return innner2
def wrapper3(func): #func --->inner1
def innner3(*args,**kwargs):
print('wrapper3,before func')
ret = func() #inner1
print('wrapper3,after func')
return ret
return innner3
@wrapper3
@wrapper2 #f=wrapper2(f) === wrapper(inner1) ===inner2
@wrapper1 #f=wrapper1(f) ==inner1 函数最近的装饰器先执行
def f():
print('##########333')
return 'hahahah'
print(f()) #-----》inner2()

wrapper3,before func
wrapper2,before func
wrapper1,before func
##########333
wrapper1,after func
wrapper2,after func
wrapper3,after func
hahahah

 

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

  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. 从入门到自闭之python三大器--装饰器进阶

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

  7. CSIC_716_20191113【装饰器进阶以及迭代器】

    装饰器的进阶主要包含叠加装饰器和有参装饰器 叠加装饰器:在一个被装饰的对象中,添加多个装饰器. 为什么要用叠加装饰器的原因:    -每一个新的功能都应该写一个新的装饰器,否则会导致,代码冗余,结构不 ...

  8. day13.装饰器进阶,迭代器

    1.from functools import wraps 这个函数可以保留原来函数的属性 # from functools import wraps def car_time(fun): # @wr ...

  9. Python学习之装饰器进阶

    函数知识回顾: 函数的参数分为:实参和形参. 实参:调用函数的时候传入的参数: 形参:分为3种(位置参数.默认参数.动态传参) 位置参数:必须传值 def aaa(a,b): print(a,b) a ...

随机推荐

  1. UVa12186:Another Crisis(树形DP)

    一道简单的树形DP送给你. A couple of years ago, a new world wide crisis started, leaving many people with econo ...

  2. 【aspnetcore】在asp.net core中配置使用AutoMapper

    网上使用AutoMapper的文章很多,就不多说了.这里主要记录一下怎么在项目中配置和使用. 首先是从NuGet获取AutoMapper. 在Startup.cs文件中注册AutoMapper服务 p ...

  3. Java的Cloneable接口还有深浅复制

    我的小记录 首先语法上,搞清除,Java有个Cloneable接口,但这个接口是没有定义方法的. 那实现了这个接口有什么用呢? 再看Object类中,有个clone()方法,这个方法提供一个浅复制的功 ...

  4. drupal基本知识介绍

    2. Drupal 安装在安装Drupal前,你需要在服务器上先搭建一个PHP+MySQL环境.专业网站一般是安装LAMP(Linux+Apache+MySQL+PHP).环境的搭建可参考如下文章:  ...

  5. .aspx设置跨域

    在web.config添加节点 <system.webServer>下添加 <httpProtocol>      <customHeaders>        & ...

  6. 5个典型的JavaScript面试题

    在IT界,需要大量的 JavaScript 开发者.如果你的能力能够胜任这一角色,那么你将获得许多换工作和提高薪水的机会.但是在你被公司录取之前,你需要展现你的技术,以便通过面试环节.在这篇文章中,我 ...

  7. 提高VS2010运行速度的技巧+关闭拼写检查

    任务管理器,CPU和内存都不高,为何?原因就是VS2010不停地读硬盘导致的; 写代码2/3的时间都耗在卡上了,太难受了; 研究发现,VS2010如果你装了VC等语言,那么它就会自动装SQL Serv ...

  8. Hibernate:Disjunction&Conjunction构造复杂的查询条件.

    Hibernate:Disjunction&Conjunction构造复杂的查询条件 Disjunction和Conjunction是逻辑或和逻辑与,如下: 用来组合一组逻辑或[or]条件的方 ...

  9. 更改IDEA默认使用JDK1.5编译项目

    在使用IDEA编译项目时,总是提示我编译失败,有些功能是在1.5之后的版本才支持.废了好大的功夫才编译成功.下面呢,就是更改编译的过程了! 一.初步更改 使用快捷键Ctrl+Alt+Shift+S打开 ...

  10. SQL 基本编程

    定义变量 赋值 取值 分支语句 循环语句 定义变量 declare @变量   数据类型          //@必须带着  不然程序不知道变量是什么  不带@   电脑会报错 例如 declare ...