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 一.装饰器 装饰器可以使函数执 ...
随机推荐
- 第六章 图(b1)邻接矩阵
- Halcon中数据的四舍五入、取整、有效数字以及和字符串之间的转换
*此代码可直接复制到HDevelop中运行 a:= 3.456 *取整.取最近的整数 int_a := int(a) //取整数部分,结果是3 round_a := round(a) //将输入元组转 ...
- css hover使用条件
1:必须是其子元素才可以使用: 举例: css: 正确:.group-goodsList ul li:hover .msct{background-color: #ff4000;color: #FFF ...
- Codeforces 710C. Magic Odd Square n阶幻方
C. Magic Odd Square time limit per test:1 second memory limit per test:256 megabytes input:standard ...
- jps 命令详解
jps 命令详解 jps 是 jdk 提供的一个查看当前 java 进程的小工具, 可以看做是 JavaVirtual Machine Process Status Tool 的缩写.非常简单实用. ...
- 移动文件读/写指针----lseek
头文件:#include<sys/types.h>.#include<unistd.h> 函数原型:off_t lseek(int fildes,off_t offset,in ...
- Python鸭子类型思想
动态语言中经常提到鸭子类型,所谓鸭子类型就是:如果走起路来像鸭子,叫起来也像鸭子,那么它就是鸭子(If it walks like a duck and quacks like a duck, it ...
- KBMMW 4.83.00 发布
新版本又来了,端午节都不让大家过好:) 这次终于支持ios 64了,不用我再手工改了. Components4Developers is a company established in 1999 w ...
- jQuery DataTables插件分页允许输入页码跳转
背景说明 项目中使用jQuery DataTables插件来实现分页表格,但是默认的分页样式不能输入页码进行跳转,在页数非常多的时候使用很不方便,最主要的还是没有达到产品部门的设计要求,所以我需要寻找 ...
- 2018.09.26洛谷P3957 跳房子(二分+单调队列优化dp)
传送门 表示去年考普及组的时候失了智,现在看来并不是很难啊. 直接二分答案然后单调队列优化dp检验就行了. 注意入队和出队的条件. 代码: #include<bits/stdc++.h> ...