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 ...
随机推荐
- 使用TypeScript拓展你自己的VSCode
转自:http://www.iplaysoft.com/brackets.html使用TypeScript拓展你自己的VSCode! 0x00 前言在前几天的美国纽约,微软举行了Connect(); ...
- poj1330lca入门题
直接套模板,dfs的时候注意起点 #include<map> #include<set> #include<cmath> #include<queue> ...
- 十二 web爬虫讲解2—Scrapy框架爬虫—Scrapy模拟浏览器登录—获取Scrapy框架Cookies
模拟浏览器登录 start_requests()方法,可以返回一个请求给爬虫的起始网站,这个返回的请求相当于start_urls,start_requests()返回的请求会替代start_urls里 ...
- lambda表达式----使用
List<THealthKnowledgeEntity> tHealthKnowledgeList = tHealthKnowledgeService.queryList(query);L ...
- iptables(三)iptables规则管理(增、删、改)
上一篇文章中,我们已经学会了怎样使用iptables命令查看规则,那么这篇文章我们就来总结一下,怎样管理规则. 之前,我们把查看iptables规则的操作比作"增删改查"当中的&q ...
- 注册表操作的几个windows api
(转自:http://blog.sina.com.cn/s/blog_4e66c6cd01000bcu.html) 键管理类: RegCloseKey():关闭注册表键释放句柄. RegC ...
- react: redux-devTools
import {composeWithDeTools} from 'redux-devtools-extension'; const bindMiddleware = middleware => ...
- linux使用virtualenv构建虚拟环境,requirement.txt记录包版本
virtualenv介绍: virtualenv把是一个把python应用隔离在一个虚拟环境中的工具.网上的例子较多,这里重点讲述怎么使用virtualenv来激活一个虚拟环境,并且记录虚拟环境中所依 ...
- So sad! ,Asphyre Closure
So sad ! Asphyre Closure! 不过我相信开发App用Delphi应该是快的. 越与平台无关,优势越明显. 积累的组件市场. 虽然objc 有很多开源支持. 但总感觉还不够delp ...
- (八)js函数二
1.变量 a)局部变量:在所有函数内部定义的变量,或者在函数内部未使用var声明的变量也属于全局变量. b)全局变量:在所有函数外部定义的变量. eg: 1) var a = 5,b = 4, ...