python开发函数进阶:装饰器
一,装饰器本质
闭包函数
功能:就是在不改变原函数调用方式的情况下,在这个函数前后加上扩展功能
作用:解耦,尽量的让代码分离,小功能之前的分离。
解耦目的,提高代码的重用性
二,设计模式
开放封闭原则
*对扩展是开放的
*对修改是封闭的
三,代码解释
*通用代码
#!/usr/bin/env python
#_*_coding:utf-8_*_ def timmer(func): #---> jjj
def inner(*args,**kwargs):
ret = func(*args,**kwargs) # --->ret = jjj()
# print('没有返回值的调用')
return ret
return inner @timmer #jjj = timmer(jjj) 语法糖
def jjj():
return 123
# jjj() #调用函数,如果被装饰的函数有返回值,就需要下边的代码
ret = jjj() #==>inner 有返回值
print(ret) #返回123
执行顺序

*用装饰器简单实现用户登录,登陆一个函数成功,无需再次登陆
#!/usr/bin/env python
#_*_coding:utf-8_*_ tag = False def login(func):
def inner(*args,**kwargs):
global tag
if tag == False:
user = input('please your username>>>:')
pwd = input('please your password>>>:')
f = open('aaa','r',encoding='utf-8')
for i in f:
user_pwd = eval(i)
if user == user_pwd['name'] and pwd == user_pwd['password']:
tag = True
f.close()
if tag:
ret = func(*args,**kwargs)
return ret
return inner @login
def haha(*args,**kwargs):
print('中国动漫')
pass @login
def hengheng(*args,**kwargs):
print('美国动漫')
pass
##########用户调用方式
haha()
hengheng()
*统计函数中有多少个函数被装饰了
#!/usr/bin/env python
#_*_coding:utf-8_*_ l = []
def wrapper(func):
#l.append(func) #统计当前程序中有多少个函数被装饰了
def inner(*args,**kwargs):
l.append(func) #统计本次程序执行有多少个带这个装饰器的函数被调用了
ret = func(*args,**kwargs)
return ret
return inner @wrapper #f1 = wrapper(f1)
def f1():
print('in f1') @wrapper #f2 = wrapper(f2)
def f2():
print('in f2') @wrapper #f2 = wrapper(f2)
def f3():
print('in f3')
f1()
f2()
f3() print(len(l))
四,双层带参数的装饰器
顾名思义,就是给装饰器添加参数
可以控制被装饰的函数是否需要这个装饰器,或者其他用法
#!/usr/bin/env python
#_*_coding:utf-8_*_ #带参数的装饰器 开关 ,控制是否需要装饰器 F = False #通过这里控制是否需要装饰器
def outer(flag):
#以下是装饰器
def wrapper(func):
def inner(*args,**kwargs):
if flag:
print('before') #被装饰代码运行之前
ret = func(*args,**kwargs) #被装饰的代码
print('after') #被装饰代码运行之后
else:
ret = func(*args, **kwargs)
return ret
return inner
###########################
return wrapper @outer(F) # F默认是FALSE,那么装饰器没有用上,因为 if false: ret = func(),因为加了括号直接执行,返回了wrapper,后面就是装饰器过程了
def hahaha():
print('hahaha') @outer(F) # F如果是TRUE,就用上了装饰器
def shuangww():
print('shuangwaiwai') shuangww()
hahaha()
执行过程

五,多个装饰器装饰一个函数(非重点)
#!/usr/bin/env python
#_*_coding:utf-8_*_ #多个装饰器装饰一个函数
def qqxing(func): #func = pipixia_inner
def qqxing_inner(*args,**kwargs):
print('in qqxing:before')
ret = func(*args,**kwargs) #pipixia_inner
print('in qqxing:after')
return ret
return qqxing_inner def pipixia(func): #dapangxie
def pipixia_inner(*args,**kwargs):
print('in pipixia:before')
ret = func(*args,**kwargs) #dapangxie
print('in pipixia:after')
return ret
return pipixia_inner #qqxing(pipixia_inner) -->dapangxie = qqxing_inner()
@qqxing #dapangxie = qqxing(dapangxie) -->dapangxie = qqxing(pipixia(dapangxie)) -->
@pipixia #dapangxie = pipixia(dapangxie)
def dapangxie():
print("饿了么")
dapangxie() #dapangxie = pipixia(dapangxie)
#dapangxie = qqxing(dapangxie) -->dapangxie = qqxing(pipixia(dapangxie))
#pipixia(dapangxie) == >pipixia_inner
#qqxing(pipixia_inner) = qqxing_inner
#dapangxie() ==> qqxing_inner()
python开发函数进阶:装饰器的更多相关文章
- Python开发——函数【装饰器、高阶函数、函数嵌套、闭包】
装饰器 装饰器本质就是函数,为其他函数添加附加功能. 原则: 不修改被修饰函数的源代码 不修改被修饰函数的调用方法 装饰器知识储备:装饰器 = 高阶函数 + 函数嵌套 + 闭包 案例:求函数运行时间! ...
- Python全栈开发之路 【第五篇】:Python基础之函数进阶(装饰器、生成器&迭代器)
本节内容 一.名称空间 又名name space,就是存放名字的地方.举例说明,若变量x=1,1存放于内存中,那名字x存放在哪里呢?名称空间正是存放名字x与1绑定关系的地方. 名称空间共3种,分别如下 ...
- python 基础篇 11 函数进阶----装饰器
11. 前⽅⾼能-装饰器初识本节主要内容:1. 函数名的运⽤, 第⼀类对象2. 闭包3. 装饰器初识 一:函数名的运用: 函数名是一个变量,但他是一个特殊变量,加上括号可以执行函数. ⼆. 闭包什么是 ...
- Python全栈之路----函数进阶----装饰器
Python之路,Day4 - Python基础4 (new版) 装饰器 user_status = False #用户登录后改为True def login(func): #传入想调用的函数名 de ...
- python 二——函数、装饰器、生成器、面向对象编程(初级)
本节内容 1.函数 2.装饰器 3.生成器 4.类 一.函数 函数式:将某功能代码封装到函数中,日后便无需重复编写,仅调用函数即可 面向对象:对函数进行分类和封装,让开发“更快更好更强...” 函数式 ...
- python闭包函数与装饰器
目录 闭包函数 闭包概念 实际应用 装饰器 简介 简单版本装饰器 进阶版本装饰器 完整版本装饰器 装饰器模板 装饰器语法糖 装饰器修复技术 问题 答案 闭包函数 闭包概念 闭:定义在函数内部的函数 包 ...
- [Python]返回函数,装饰器拾遗
def lazy_print(*args): def pr(): print(args) return pr 当我们调用lazy_print()时,返回的并不是求和结果,而是求和函数: >> ...
- python开发函数进阶:可迭代的&迭代器&生成器
一,可迭代的&可迭代对象 1.一个一个的取值就是可迭代的 iterable#str list tuple set dict#可迭代的 ——对应的标志 __iter__ 2.判断一个变量是不 ...
- python基础-函数之装饰器、迭代器与生成器
1. 函数嵌套 1.1 函数嵌套调用 函数的嵌套调用:在调用一个函数的过程中,又调用了其他函数 def bar(): print("from in the bar.") def f ...
随机推荐
- linux安装----gcc
Linux中gcc是个编译工具,可以将源码文件(c c++ java文件) 编译成 二进制文件.
- selenium学习笔记(加入unittest)
利用firefox浏览器的selenium IDE可以直接生成webdriver+unittest的python脚本 当然博主是要为了自己编写脚本.对用例内容进行了修改,把元素校验功能也放入了用例中 ...
- java-给微信推送消息 利用企业微信
目的:给关注用户推送消息 场景:自动化测试,运维监控,接口访问等报错预警.例如线上接口报错,发送提醒消息 准备工作: 1:注册企业号(为什么不用公众号呢?) 企业号注册 2:常用参数介绍: 1:COR ...
- C++(十五) — sizeof 运算符
1.基本数据类型 sizeof 是一个关键字,它是一个编译时运算符,用于判断变量或数据类型的字节大小. sizeof 运算符可用于获取类.结构.共用体和其他用户自定义数据类型的大小. 使用 sizeo ...
- FMDB官方使用文档 G-C-D的使用 提高性能(翻译)
由于FMDB是建立在SQLite的之上的,所以你至少也该把这篇文章从头到尾读一遍.与此同时,把SQLite的文档页 加到你的书签中.自动引用计数(APC)还是手动内存管理呢? 两种都行,FMDB会 ...
- asp.net获取URL和IP地址
(转自:http://www.cnblogs.com/JuneZhang/archive/2010/11/26/1888863.html) HttpContext.Current.Request.Ur ...
- Framework、Cocoa、Xcode
什么是Cocoa? NeXTSTEP(以Unix作为内核的操作系统)内置的许多库(libraries)和工具,让程序员以一种优雅的方式与窗口管理器进行交互,这些libraries叫做Framework ...
- BloomFilter布隆过滤器使用
从上一篇可以得知,BloomFilter的关键在于hash算法的设定和bit数组的大小确定,通过权衡得到一个错误概率可以接受的结果. 算法比较复杂,也不是我们研究的范畴,我们直接使用已有的实现. go ...
- 使用redis计数来控制单位时间内对某接口的访问量,防止刷验证码接口之类的
使用自定义注解的方式,在需要被限制访问频率的方法上加注解即可控制. 看实现方式,基于springboot,aop,redis. 新建Springboot工程,引入redis,aop. 创建注解 pac ...
- 在ubuntu14.4里编译UBOOT出错
出错信息如下: OBJCOPY examples/standalone/hello_world.bin LDS u-boot.lds LD u-boot./scripts/dtc ...