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. scrapy的中间件Downloader Middleware实现User-Agent随机切换

    scrapy的中间件Download Middleware实现User-Agent随机切换   总架构理解Middleware 通过scrapy官网最新的架构图来理解: 从图中我们可以看出,在spid ...

  2. windows安装redis和PHP redis扩展

    1.安装Redis (1)这里选择在github官网上下载Redis,地址:Redis下载地址 下载压缩包(如下图),并解压到本地目录,我放在D:\wamp\redis\redis-windows ( ...

  3. 095 Unique Binary Search Trees II 不同的二叉查找树 II

    给出 n,问由 1...n 为节点组成的不同的二叉查找树有多少种?例如,给出 n = 3,则有 5 种不同形态的二叉查找树:   1         3     3      2      1    ...

  4. freertos之资源管理学习

    OS下在对硬件外设资源操作.多任务的共享变量.任务和中断的共享变量操作时需要考虑资源的完整性和安全性. FREERTOS提供了临界区.调度器上锁.互斥量.优先级自动继承.创建守护任务的方法来改变最小优 ...

  5. 如何查找Oracle某列值相同的字段

    相关的sql语句如下 select xm_guidfrom T_NZYDKgroup by xm_guidhaving count (*)>1

  6. MFC双缓冲解决图象闪烁[转]

    转载网上找到的一篇双缓冲的文章,很好用.http://www.cnblogs.com/piggger/archive/2009/05/02/1447917.html__________________ ...

  7. 洛谷 P2936 [USACO09JAN]全流Total Flow

    题目描述 Farmer John always wants his cows to have enough water and thus has made a map of the N (1 < ...

  8. ubuntu 14.04安装 nginx直播服务平台

    在官网上下载nginx,可以选中直接从ubuntu的源红直接安装:sudo apt-get install nginx.还有就是源码编译安装,我选择的是源码编译安装.具体的步骤如下: ll /usr/ ...

  9. vs和github同步开发步骤

    首先,这是在visual studio中使用.需要了解关于vs同步github必不可少.下载安装破解什么的先完成vs. 1. 然后安装一个vs中使用github的插件.vs自带的下载.这个是下载地址. ...

  10. WPF中退出时显示是否保存数据提示

    一.通过窗体中的按钮实现退出时数据保存提示 Xaml: <Grid> <TextBlock HorizontalAlignment="Left" Margin=& ...