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 ...
随机推荐
- git 分支管理 (转自廖雪峰的git教程)
在版本回退里,你已经知道,每次提交,Git都把它们串成一条时间线,这条时间线就是一个分支.截止到目前,只有一条时间线,在Git里,这个分支叫主分支,即master分支.HEAD严格来说不是指向提交,而 ...
- EditText实现输入限制和校验
EditText实现输入限制和校验 一.方法 1)输入限制 1.通过android:digits限制只能输入小写abc android:digits="abc" 2.通过andro ...
- Selenium with Python 005 - 调用js操作页面元素
WebDriver提供了execute_script()方法来执行JavaScript方法,格式如 driver.execute_script(script,*args) 执行js一般有两种场景,一是 ...
- IOS-社会化分享
一.如何实现社交分享 在iOS中,实现“社交分享”的方法 1.自己编写各个平台的分享代码(代码量较多) 2.利用iOS自带的Social.framework 3.利用第三方的分享框架 友盟分享 ...
- 【Python】小技巧
1. 退出python shell 在windows下,Ctrl + Z退出 在unix下,Ctrl + D退出
- day5-time & datetime模块
1.概述 程序设计开发过程中,往往存在很多场景,需要把时间和日期以某种特定形式格式化输出,在python中我们需要借助time & datetime模块来实现,今天就来一探这两大模块的究竟. ...
- Win7 x64安装Paramiko
先说一下我的环境: win7 x64 旗舰版.Python3.5.0.pip8.1.0 pip install paramiko时报错如下: 大概意思: blablabla... 反正大概意思就是少G ...
- 基于Python实现的四则运算生成程序
Github项目地址:传送门 小组成员:黄晓彬(代码实现) 黄钰城(代码审查) 需求: 1. 使用 -n 参数控制生成题目的个数. 2. 使用 -r 参数控制题目中数值(自然数.真分数和真分数分母)的 ...
- sysbench安装for oracle
RHEL7.2+ 1.依赖包安装 * autoconf * automake * cdbs * debhelper (>= 9) * docbook-xml * docbook-xsl * li ...
- python tricks —— datetime 删除日期中的前导 0
>> from datetime import datetime >> now = datetime.now() >> now.strftime('%Y-%m-%d ...