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 一.装饰器 装饰器可以使函数执 ...
随机推荐
- Linux 线程调度
1.线程sleep()后,会让出cpu的时间片,交由其他线程进行抢占cpu. 线程之间正常的切换是依靠时间片的. 当主线程没有结束,且其在所占有的时间片内,并没有结束自己的工作,此时,子线程将会抢占c ...
- LocalBroadcastManager 的使用
一.使用本地广播发送一条广播(本例为自己发送自己接收,本地广播也可以是其他应用接收)然后接收到广播时回调Receiver类中的回调方法onReceive()在此方法中自定义发出通知 代码 packag ...
- dede搜索页面上某些标签无法使用
dede默认的搜索模板是search.htm,但在模板文件中使用{dede:type}{/dede:type}或{dede:flink}{/dede:flink}时,发现标签并没有被解析,显示为空. ...
- Spring框架之log日志的使用
1.Spring框架也需要引入日志相关的jar包 * 在spring-framework-3.0.2.RELEASE-dependencies/org.apache.commons/com.sprin ...
- Django之virtualenv下安装xadmin
1.安装xadmin,通过pip 进入virtualenv pip安装xadmin pyyuc:~ yuchao$ source PycharmProjects/mxvenv/bin/activate ...
- Codeforces 607A 动态规划
A. Chain Reaction time limit per test 2 seconds memory limit per test 256 megabytes input standard i ...
- vue.js vue-cli 中解决 axios 跨域调用的问题
修改 /config/index.js 文件如下: proxyTable: { '/api': { target: 'http://chifan.local', changeOrigin: true, ...
- 构造函数constructor 与析构函数destructor(二)
(1)转换构造函数 转换构造函数的定义:转换构造函数就是把普通的内置类型转换成类类型的构造函数,这种构造函数只有一个参数.只含有一个参数的构造函数,可以作为两种构造函数,一种是普通构造函数用于初始化对 ...
- 多网卡的7种bond模式原理 For Linux
多网卡的7种bond模式原理 Linux 多网卡绑定 网卡绑定mode共有七种(0~6) bond0.bond1.bond2.bond3.bond4.bond5.bond6 常用的有三种 mode=0 ...
- 2018.10.13 bzoj4008: [HNOI2015]亚瑟王(概率dp)
传送门 马上2点考初赛了,心里有点小紧张. 做道概率dp压压惊吧. 话说这题最开始想错了. 最开始的方法是考虑f[i][j]f[i][j]f[i][j]表示第iii轮出牌为jjj的概率. 然后用第ii ...