Python9-装饰器进阶-day12
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的更多相关文章
- Python函数--装饰器进阶
开放封闭原则 1.对扩展是开放的 为什么要对扩展开放呢? 我们说,任何一个程序,不可能在设计之初就已经想好了所有的功能并且未来不做任何更新和修改.所以我们必须允许代码扩展.添加新功能. 2.对修改是封 ...
- day 12 - 1 装饰器进阶
装饰器进阶 装饰器的简单回顾 装饰器开发原则:开放封闭原则装饰器的作用:在不改变原函数的调用方式的情况下,在函数的前后添加功能装饰器的本质:闭包函数 装饰器的模式 def wrapper(func): ...
- Python装饰器进阶
装饰器进阶 现在,我们已经明白了装饰器的原理.接下来,我们还有很多事情需要搞清楚.比如:装饰带参数的函数.多个装饰器同时装饰一个函数.带参数的装饰器和类装饰器. 装饰带参数函数 def foo(fun ...
- day4之装饰器进阶、生成器迭代器
装饰器进阶 带参数的装饰器 # 某一种情况# 500个函数加装饰器, 加完后不想再加这个装饰器, 再过一个季度,又想加上去# 你可以设计你的装饰器,来确认是否执行 # 第一种情况 # 想要500个函数 ...
- (转)python装饰器进阶一
Python装饰器进阶之一 先看例子 网上有很多装饰器的文章,上来说半天也没让人看明白装饰器到底是个什么,究竟有什么用,我们直接来看几个例子. Python递归求斐波那契数列 def fibonacc ...
- 从入门到自闭之python三大器--装饰器进阶
装饰器的进阶 有参装饰器: # def warpper(func): # def inner(*args,**kwargs): # user = input("user:") # ...
- CSIC_716_20191113【装饰器进阶以及迭代器】
装饰器的进阶主要包含叠加装饰器和有参装饰器 叠加装饰器:在一个被装饰的对象中,添加多个装饰器. 为什么要用叠加装饰器的原因: -每一个新的功能都应该写一个新的装饰器,否则会导致,代码冗余,结构不 ...
- day13.装饰器进阶,迭代器
1.from functools import wraps 这个函数可以保留原来函数的属性 # from functools import wraps def car_time(fun): # @wr ...
- Python学习之装饰器进阶
函数知识回顾: 函数的参数分为:实参和形参. 实参:调用函数的时候传入的参数: 形参:分为3种(位置参数.默认参数.动态传参) 位置参数:必须传值 def aaa(a,b): print(a,b) a ...
随机推荐
- 使用CSS 实现菱形图片,斜条纹背景
比较简单的菱形图片: 效果如下 代码部分: <div class="d1"> <img src="img/5.jpg"> </di ...
- morphia(3)-查询
1.查询所有 @Test public void query() throws Exception { final Query<Employee> query = datastore.cr ...
- Vuex.js状态管理共享数据 - day8
VScode文件目录: amount.vue代码如下: <template> <div> <!-- <h3>{{ $store.state.count }}& ...
- js图片预加载以及延迟加载
当我们需要做图片轮播的时候,如果让图片提前下载到本地,用浏览器缓存起来,我们可以用Image对象: function preLoadImg(){ var img=new Image(); img.sr ...
- android 日期 时间
/** * 给定一个日期型字符串,返回加减n天后的日期型字符串 * * @param basicDate * @param nDays * @return */ public static Strin ...
- iOS:让UIView覆盖导航栏
当我们想做一个弹出式菜单时,想将导航栏也一起盖住不显示的话,可以用如下语句实现: UIView* myView = /* 你自定义的view */; UIWindow* currentWindow = ...
- [总结].net操作MongoDb通用基础类1:
public class MongoDBHelper { //定义Mongo服务 private MongoServer mongo = null; //获取databaseName对应的数据库,不存 ...
- 查询sqlserver数据库,表占用数据大小
if exists(select 1 from tempdb..sysobjects where id=object_id('tempdb..#tabName') and xtype='u')dro ...
- 查看Windows激活信息
使用 Windows + R组合快捷键打开运行命令框 1.运行: slmgr.vbs -dlv 可以查询到Win10的激活信息,包括:激活ID.安装ID.激活截止日期等信息. 2.运行: slmgr. ...
- An internal error occurred during: "Map/Reduce location status updater". java.lang.NullPointerException
eclipse配置hadoop 2.6 服务器做的虚拟机,因为window是的hadoop会出现意想不到的错误,因为,我做了ubuntu的虚拟机供我使用 在虚拟机中进行映射设置 在eclipse中dr ...