一,装饰器本质

闭包函数

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

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

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

二,设计模式

开放封闭原则

*对扩展是开放的

*对修改是封闭的

三,代码解释

*通用代码

 #!/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. 新东方雅思词汇---8.1、reckon

    新东方雅思词汇---8.1.reckon 一.总结 一句话总结:reck(注意,留心)+on 英 ['rek(ə)n]  美 ['rɛkən]  vt. 测算,估计:认为:计算 vi. 估计:计算:猜 ...

  2. pipenv安装库使用国内镜像

    pipenv install django超级慢,卡住不动,最后不得不CTRL+C中止 这时有必要改成国内源了,打开Pipfile文件,发现内容是: [[source]] verify_ssl = t ...

  3. uva 10125 二分

    https://vjudge.net/problem/UVA-10125 和之前做过的一道a+b+c=X的问题类似,不过这个要求多了a+b+c=d-->a+b=d-c  且abcd互不相等 我们 ...

  4. HDU 4725 建图

    http://acm.hdu.edu.cn/showproblem.php?pid=4725 The Shortest Path in Nya Graph Time Limit: 2000/1000 ...

  5. android多国语言使用

    多国语言:在res目录下建立不同名称的values文件来调用不同的语言包 Values文件汇总如下: 中文(中国):values-zh-rCN 中文(台湾):values-zh-rTW 中文(香港): ...

  6. Caffe初试

    1.基本概念 Caffe是一个比较流行的神经网络框架,它支持C++.Python等语言,容易上手,但是代码貌似不怎么好读,等有空我...;) 2.Windows10下的部署 我把我Windows下的编 ...

  7. LeetCode OJ:Jump Game(跳跃游戏)

    Given an array of non-negative integers, you are initially positioned at the first index of the arra ...

  8. .NET学习路线之我见(转)

    这是我的第一篇博客,所以,我想写个大的,至少这个话题是比较大的. 在文章的开头,首先声明,这篇文章仅代表我个人的想法,并且只适合.NET的初学者,如果你已经有两年以上的开发经验,我劝你还是别看了,省得 ...

  9. [置顶] Android 关于ToolBar分分钟玩死自己?

    场景一: 今天早上十点高高兴兴的跟平时早上一样买一杯粥然后一边喝着一边去上班,步行了15分钟到了公司,然后打指纹开门,然后就愉快的写代码了,我擦,好想电脑没开机,我晕好像没带眼镜,发现最近记性不是很好 ...

  10. Linux下windows中文文本文件乱码问题

    table of content: 乱码问题 用gedit选择正确的字符编码打开文件 文件转码 总结 §乱码 Fedora安装时默认用UTF-8字符编码方式, 这么做有国际化的好处(和很多用utf-8 ...