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. django_logging

    django使用python自带的logging打印日志 logging 是线程安全的,其主要由4部分组成: Logger 用户使用的直接接口,将日志传递给Handler Handler 控制日志输出 ...

  2. Guard Duty (hard) Codeforces - 958E3 || uva 1411

    https://codeforces.com/contest/958/problem/E3 当没有三点共线时,任意一个这样的点集都是保证可以找到答案的,(考虑任意一种有相交的连线方案,一定可以将其中两 ...

  3. 排错:expected unqualified-id before string constant

    一个低级但是不好定位的编译错误,常见的问题是: 1. 语句的 { 括号不匹配. 2. 缺少 : , 特别是类的定义或声明,枚举的定义. 3. 变量名或函数名使用了保留字.

  4. [转]NopCommerce之视图设计

    本文转自:http://blog.csdn.net/hygx/article/details/7324452 Designer's Guide   Contents Overview  概述 Inst ...

  5. 6.html图像标记img

    <html> <head> <title>第六课标签</title> <meta charset="utf-8"> &l ...

  6. 【js】数组去重时间复杂度为n的方法

    # 时间复杂度O(n^2) function fn(arr) { return arr.filter((item, index, arr) => arr.indexOf(item) === in ...

  7. css绝对定位元素实现居中的几个方法

    一:CSS绝对定位元素left设为50%实现水平居中 绝对定位的元素left设为50%时,是已左上角为原点的,所以只要再使用margin属性添加负值补偿回来即可.示例:[css]代码如下: #boar ...

  8. 洛谷 P1996 约瑟夫问题

    题目背景 约瑟夫是一个无聊的人!!! 题目描述 n个人(n<=100)围成一圈,从第一个人开始报数,数到m的人出列,再由下一个人重新从1开始报数,数到m的人再出圈,……依次类推,直到所有的人都出 ...

  9. RMQ求区间最大最小值

    #include<iostream> #include<cmath> #include<cstdio> #define N 50005 using namespac ...

  10. 快学UiAutomator新建第一个测试工程

    1.打开Eclipse 2.新建一个java项目,包 3.增加build path,加载需要的库文件jar包 4.新建测试类,继承UIAutomatorTestCase 5.编写测试用例,方法名必须t ...