一,装饰器本质

闭包函数

功能:就是在不改变原函数调用方式的情况下,在这个函数前后加上扩展功能

作用:解耦,尽量的让代码分离,小功能之前的分离。

   解耦目的,提高代码的重用性

二,设计模式

开放封闭原则

*对扩展是开放的

*对修改是封闭的

三,代码解释

*通用代码

 #!/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开发函数进阶:装饰器的更多相关文章

  1. Python开发——函数【装饰器、高阶函数、函数嵌套、闭包】

    装饰器 装饰器本质就是函数,为其他函数添加附加功能. 原则: 不修改被修饰函数的源代码 不修改被修饰函数的调用方法 装饰器知识储备:装饰器 = 高阶函数 + 函数嵌套 + 闭包 案例:求函数运行时间! ...

  2. Python全栈开发之路 【第五篇】:Python基础之函数进阶(装饰器、生成器&迭代器)

    本节内容 一.名称空间 又名name space,就是存放名字的地方.举例说明,若变量x=1,1存放于内存中,那名字x存放在哪里呢?名称空间正是存放名字x与1绑定关系的地方. 名称空间共3种,分别如下 ...

  3. python 基础篇 11 函数进阶----装饰器

    11. 前⽅⾼能-装饰器初识本节主要内容:1. 函数名的运⽤, 第⼀类对象2. 闭包3. 装饰器初识 一:函数名的运用: 函数名是一个变量,但他是一个特殊变量,加上括号可以执行函数. ⼆. 闭包什么是 ...

  4. Python全栈之路----函数进阶----装饰器

    Python之路,Day4 - Python基础4 (new版) 装饰器 user_status = False #用户登录后改为True def login(func): #传入想调用的函数名 de ...

  5. python 二——函数、装饰器、生成器、面向对象编程(初级)

    本节内容 1.函数 2.装饰器 3.生成器 4.类 一.函数 函数式:将某功能代码封装到函数中,日后便无需重复编写,仅调用函数即可 面向对象:对函数进行分类和封装,让开发“更快更好更强...” 函数式 ...

  6. python闭包函数与装饰器

    目录 闭包函数 闭包概念 实际应用 装饰器 简介 简单版本装饰器 进阶版本装饰器 完整版本装饰器 装饰器模板 装饰器语法糖 装饰器修复技术 问题 答案 闭包函数 闭包概念 闭:定义在函数内部的函数 包 ...

  7. [Python]返回函数,装饰器拾遗

    def lazy_print(*args): def pr(): print(args) return pr 当我们调用lazy_print()时,返回的并不是求和结果,而是求和函数: >> ...

  8. python开发函数进阶:可迭代的&迭代器&生成器

    一,可迭代的&可迭代对象 1.一个一个的取值就是可迭代的   iterable#str list tuple set dict#可迭代的 ——对应的标志 __iter__ 2.判断一个变量是不 ...

  9. python基础-函数之装饰器、迭代器与生成器

    1. 函数嵌套 1.1 函数嵌套调用 函数的嵌套调用:在调用一个函数的过程中,又调用了其他函数 def bar(): print("from in the bar.") def f ...

随机推荐

  1. 关于C语言中结构体大小计算

    结构体大小的计算,.网上说法一大堆还都不一样分什么对齐不对齐,偏移量什么的.. 在此稍微举例简单总结下: 对齐原则:每一成员的结束偏移量需对齐为后一成员类型的倍数  补齐原则:最终大小补齐为成员中最大 ...

  2. C#远程开机

    什么是网络唤醒网络唤醒实现了对网络的集中管理,即在任何时刻,网管中心的IT管理人员可以经由网络远程唤醒一台处于休眠或关机状态的计算机.使用这一功能,IT管理人员可以在下班后,网络流量最小以及企业的正常 ...

  3. SimpleDateFormat函数语法

    SimpleDateFormat函数语法:         G 年代标志符         y 年         M 月         d 日         h 时 在上午或下午 (1~12)  ...

  4. 最大流EK算法/DINIC算法学习

    之前一直觉得很难,没学过网络流,毕竟是基础知识现在重新来看. 定义一下网络流问题,就是在一幅有向图中,每条边有两个属性,一个是cap表示容量,一个是flow 表示流过的流量.我们要求解的问题就是从S点 ...

  5. 51nod 1640 MST+二分

    http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1640 1640 天气晴朗的魔法 题目来源: 原创 基准时间限制:1 秒 ...

  6. Webpack——解决疑惑,让你明白

    Webpack——解决疑惑,让你明白 极客教程 作者 关注 2016.09.29 17:46* 字数 2868 阅读 22204评论 22喜欢 80 Webpack是目前基于React和Redux开发 ...

  7. ipmitool 查看硬件信息

    [root@75-6-25-yf-core ~]# cat /var/log/mcelog MCE 0HARDWARE ERROR. This is *NOT* a software problem! ...

  8. vue仿京东画线验证码,前端手指位置数据获取

    需求是这样的,京东H5移动端登录,有个安照箭头方向,画线登录的验证,看看是怎么实现的: 直接上代码了: <template> <div v-if="visible" ...

  9. 从输入url到页面加载的过程

    用户端请求步骤:DNS解析URL地址.生成HTTP请求报文.构建TCP连接.使用IP协议选择传输路线.数据链路层保证数据的可靠传输.物理层将数据转换成电子.光学或微波信号进行传输 网络传输: 从客户机 ...

  10. C#中upd分包与发送,已经实现全部代码

    using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace Tool ...