Python3------装饰器详解
装饰器
定义:本质是函数.(装饰其他函数)就是为其他函数添加附加功能
原则:1.不能修改被装饰的函数的源代码
2.不能修改被装饰的函数的调用方式
理解装饰器前提条件:
1.函数即"变量"
2.高阶函数
a.把一个函数名当做实参传给另一个函数(在不修改被装饰函数源代码的情况下为其添加功能)
b.返回值中包含函数名(不修改函数的调用方式)
3.嵌套函数
import time ################################### 高阶函数 ################################################################ '''
高阶函数
'''
#普通函数
def foo():
#阻塞两秒
time.sleep(2)
print("this is foo")
#高阶函数
def bar(func):
start_time = time.time()
func()
end_time = time.time()
print("this is func time %s"%(end_time - start_time))
return func
#初始调用foo函数的方式
# foo()
#经过高阶函数调用foo函数的方式
foo = bar(foo)
foo() ################################### 嵌套函数 ################################################################ '''
嵌套函数
'''
def bar():
start_time = time.time()
def foo():
# 阻塞两秒
time.sleep(2)
print("this is foo")
#调用普通函数
foo()
end_time = time.time()
print("this is func time %s" % (end_time - start_time)) #调用嵌套函数
bar() ################################### 简易版装饰器 ################################################################ '''
高阶函数 + 嵌套函数 => 装饰器
'''
#简易版装饰器---函数不可传入参数
def bar(func):
def inner():
start_time = time.time()
func()
end_time = time.time()
print("this is func time %s" % (end_time - start_time))
return inner #普通函数
@bar
def foo():
# 阻塞两秒
time.sleep(2)
print("this is foo") #普通调用方式
foo() ################################### 升级版装饰器 ################################################################ #升级版装饰器---函数可以传入参数
def bar(func):
def inner(*args,**kwargs):
start_time = time.time()
func(*args,**kwargs)
end_time = time.time()
print("this is func time %s" % (end_time - start_time))
return inner #普通函数
@bar
def foo(name,age):
# 阻塞两秒
time.sleep(2)
print(" %s this is foo %s"%(name,age)) @bar
def deco():
# 阻塞两秒
time.sleep(2)
print(" this is deco ") #普通调用方式
deco()
foo('zhangsan',22) ################################### 高级版装饰器 ################################################################ #高级版装饰器---装饰器与函数都可以传入参数,函数装饰内容可以根据装饰器参数做判断
#应用场景---在做用户验证时可以使用不同的验证手段,如本地验证,数据库验证,网络验证
def decorator(bath_type):
def bar(func):
def inner(*args,**kwargs):
if bath_type == 'fooname':
start_time = time.time()
func(*args,**kwargs)
end_time = time.time()
print("this is fooname time %s" % (end_time - start_time))
elif bath_type == 'deconame':
start_time = time.time()
func(*args, **kwargs)
end_time = time.time()
print("this is deconame time %s" % (end_time - start_time))
return inner
return bar #普通函数
@decorator(bath_type='fooname')
def foo(name,age):
# 阻塞两秒
time.sleep(2)
print(" %s this is foo %s"%(name,age)) @decorator(bath_type='deconame')
def deco():
# 阻塞两秒
time.sleep(2)
print(" this is deco ") #普通调用方式
deco()
foo('zhangsan',22)
Python3------装饰器详解的更多相关文章
- python设计模式之装饰器详解(三)
python的装饰器使用是python语言一个非常重要的部分,装饰器是程序设计模式中装饰模式的具体化,python提供了特殊的语法糖可以非常方便的实现装饰模式. 系列文章 python设计模式之单例模 ...
- python3 装饰器全解
本章结构: 1.理解装饰器的前提准备 2.装饰器:无参/带参的被装饰函数,无参/带参的装饰函数 3.装饰器的缺点 4.python3的内置装饰器 5.本文参考 理解装饰器的前提:1.所有东西都是对象( ...
- Python装饰器详解
python中的装饰器是一个用得非常多的东西,我们可以把一些特定的方法.通用的方法写成一个个装饰器,这就为调用这些方法提供一个非常大的便利,如此提高我们代码的可读性以及简洁性,以及可扩展性. 在学习p ...
- python之装饰器详解
这几天翻看python语法,看到装饰器这里着实卡了一阵,最初认为也就是个函数指针的用法,但仔细研究后发现,不止这么简单. 首先很多资料将装饰器定义为AOP的范畴,也就是Aspect Oriented ...
- Python中的各种装饰器详解
Python装饰器,分两部分,一是装饰器本身的定义,一是被装饰器对象的定义. 一.函数式装饰器:装饰器本身是一个函数. 1.装饰函数:被装饰对象是一个函数 [1]装饰器无参数: a.被装饰对象无参数: ...
- 闭包&装饰器详解
闭包 先不着急看闭包的定义,让我们从一段示例代码开始.如果将上一个示例稍微修改下: >>> def outer(): ... x = 1 ... def inner(): ... p ...
- python装饰器1:函数装饰器详解
装饰器1:函数装饰器 装饰器2:类装饰器 装饰器3:进阶 先混个眼熟 谁可以作为装饰器(可以将谁编写成装饰器): 函数 方法 实现了__call__的可调用类 装饰器可以去装饰谁(谁可以被装饰): 函 ...
- Python—装饰器详解
装饰器:(语法糖) 本质是函数,它是赋予函数新功能,但是不改变函数的源代码及调用方式 原则: 1.不能修改被装饰函数的源代码 2.不能修改被装饰函数的调用方式 3.函数的返回值也不变 这两点简而言 ...
- python 叠加装饰器详解
def out1(func1): #7.func1=in2的内存地址,就是in2 print('out1') def in1(): #8.调用函数index() 因为函数在in1里,所以首先运行in1 ...
- Python全栈开发之8、装饰器详解
一文让你彻底明白Python装饰器原理,从此面试工作再也不怕了.转载请注明出处http://www.cnblogs.com/Wxtrkbc/p/5486253.html 一.装饰器 装饰器可以使函数执 ...
随机推荐
- 慕课网access_token的获取(下)
接口调用返回的结果是两个字段:access_token和expires_in,所以需要创建一个实体类封装这两个字段 运行测试类WeixinTest.java控制台打印出错误信息 重置开发者密钥试试看 ...
- Java 架构师
“学习的最好途径就是看书“,这是我自己学习并且小有了一定的积累之后的第一体会.个人认为看书有两点好处: 1.能出版出来的书一定是经过反复的思考.雕琢和审核的,因此从专业性的角度来说,一本好书的价值远超 ...
- sql ltrim/rtrim 字段中为中文时出现?的问题
字段存储为中文,类型为nvarchar,使用ltrim时结果集中出现的问号,我的解决办法是:将问号replace掉
- layui学习<一>
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <meta name ...
- DB2错误码
SQL语句成功完成 01xxx SQL语句成功完成,但是有警告 + 未限定的列名被解释为一个有相互联系的引用 + 动态SQL语句用分号结束 + 没有找到满足SQL语句的行 + 用DATA CAPTUR ...
- filter 死循环(tomcat 启动完成 ,自动执行filter.dofilter,导致tomcat 启动超时) , tomcat 启动和 servers 启动 不同
package com.diancai.interceptor; import java.io.IOException; import javax.servlet.Filter; import jav ...
- jsp传中文乱码问题 encodeURIComponent()编码方法
方法一: jQuery.ajax({ type:"POST", url:"${ctx}/offer.do", ...
- 向文件写入一个数据块---write
函数原型:ssize_t write(int fd,const void *buf,size_t count); 参数说明:fd:文件描述符,buf:写入数据的缓冲区,count:写入数据的最大长度. ...
- 详解Windows Service Wrapper(winsw.exe)及应用场景
winsw.exe可以帮助nginx作为windows服务自启动,不需要每次都输入命令,很方便,使用到目前为止这种做法的效果很完美.你得到了 Windows 服务的支持,而且在服务重启时没有遗留孤立的 ...
- 2018.06.28 BZOJ1014 [JSOI2008]火星人prefix(非旋treap+hash)
[JSOI2008]火星人prefix Time Limit: 10 Sec Memory Limit: 162 MB Submit: 8951 Solved: 2860 Description 火星 ...