⼀. 通⽤装饰器的回顾

1.开闭原则: 对增加功能开放. 对修改代码封闭

2.装饰器的作⽤: 在不改变原有代码的基础上给⼀个函数增加功能

3.通⽤装饰器的写法:

def wrapper(fn):

def inner(*args,**kwargs):

print("目标函数前一行")

ret=fn(*args,**kwargs)

print("目标函数后一行")

return ret

return inner

@wrapper

def target_func(*args,**kwargs):

print("我是目标函数体")

target_func()

4.执⾏过程:

(1) 程序从上向下, 当执⾏到@wrapper的时候. 把函数作为参数传递给wrapper函数. 得到inner函数. 重新赋值给target_func

(2) 当执⾏到target_func的时候. 我们实际上执⾏的是inner函数. inner函数会先执⾏⽬标函数之前的代码. 然后再执⾏你的⽬标函数. 执⾏完⽬标函数最后执⾏的是⽬标函数

之后的代码

⼆. 函数的有⽤信息

1. 如何给函数添加注释 用三个引号来表示

def eat(food,drink):

""" eat:把传递进来的吃掉

:param food: 参数food是什么意思

:param drink: 参数drink是什么意思

:return: None 返回什么

"""

print(food,drink)

return "very good"

按住ctrl 点内置函数名,可以查看函数的注释如int,str 等

2.如何获取到函数的相关信息

def eat(food,drink):

"""

:param food: 参数food是什么意思

:param drink: 参数drink是什么意思

:return: None 返回什么

"""

print(food,drink)

# print(eat.__name__) 读取不出来

# print(eat.__doc__) 读取不出来

return "very good"

eat("水果","可乐")

print(eat.__name__) # 查询函数名

print(eat.__doc__) #查询函数文档注释

函数名.__name__可以查看函数的名字 (双下划线)

函数名.__doc__ 可以查看函数的⽂档注释

(1) 一个被装饰器装饰过的函数:查询目标函数的函数名

def wrapper(fn):

def inner(*args,**kwargs): # 聚合

print("目标函数前一行")

ret=fn(*args,**kwargs) # 打散 这⾥的作⽤. 其实就是为了保证我可以装饰所有函数⽽准备的

print("目标函数后一行")

return ret

return inner

@wrapper

def target_func(*args,**kwargs):

print("我是目标函数体")

target_func()

print(target_func.__name__) # 被装饰过的函数函数名是inner.

(2) 把上述查询函数名修改为原函数名

from functools import wraps # 加 引入函数模块

def wrapper(fn):

@wraps(fn) # 加 使用函数原来的名字

def inner(*args,**kwargs):

print("目标函数前一行")

ret=fn(*args,**kwargs)

print("目标函数后一行")

return ret

return inner

@wrapper

def target_func(*args,**kwargs):

print("我是目标函数体")

target_func()

print(target_func.__name__) # 查询结果不再是inner 而是target_func

@wrapper

def new_target_func():

print("我是另⼀个⽬标函数")

new_target_func()

print(new_target_func.__name__)

三.装饰器传参

def wrapper_out(flag):

def wrapper(fn):

def inner(*args,**kwargs):

if flag==True: # 设定条件,满足执行下一步

print("目标函数前一行")

ret=fn(*args,**kwargs)

print("目标函数后一行")

else: # 不满足执行这一步

ret=fn(*args,**kwargs)

return ret

return inner

return wrapper

@wrapper_out(True)

def target_func():

print("我是目标函数体")

target_func() # 目标函数前一行,我是目标函数体,目标函数后一行

@wrapper_out(False)

def target_func():

print("我是目标函数体")

target_func() # 我是目标函数体

执行步骤: 先执⾏wrapper(True) 然后再@返回值. 返回值恰好是wrapper. 结果就是@wrapper

四.多个装饰器装饰一个函数

def wrapper(fn):

def inner(*args,**kwargs):

print("我是a")

ret=fn(*args,**kwargs)

print("我是b")

return ret

return inner

def wrapper1(fn):

def inner(*args,**kwargs):

print("我是c")

ret=fn(*args,**kwargs)

print("我是d")

return ret

return inner

def wrapper2(fn):

def inner(*args,**kwargs):

print("我是e")

ret=fn(*args,**kwargs)

print("我是f")

return ret

return inner

@wrapper2

@wrapper1

@wrapper

def eat(*args,**kwargs):

print("我是目标函数")

eat()

执行步骤:

执⾏顺序:

⾸先@wrapper1装饰起来. 然后获取到⼀个新函数是wrapper1中的inner.

然后执⾏@wrapper2.这个时候. wrapper2装饰的就是wrapper1中的inner.

第⼆层装饰器前(第⼀层装饰器前(⽬标)第⼀层装饰器后)第⼆层装饰器后. 程序从左到右执⾏

五.补充知识点

python全栈开发总结_python全栈开发 * 12 知识点汇总 * 180530相关推荐

  1. 初级python爬虫工程师面试题_Python爬虫工程师常见面试题汇总

    爬虫是Python的重要应用方向之一,也是学习Python的学员求职的主要方向.为了帮助学员更快更好的通过企业面试,小编悉心整理了5道Python爬虫面试题及答案,希望能够给大家提供帮助! 1.简要介 ...

  2. python全栈开发优势_Python全栈开发多少钱?学Python价格贵吗?

    Python全栈开发培训多少钱?学习Python是大家进入编程世界的理想之选,而且Python也是一门非常受欢迎的编程,可以从事的领域有很多. 从目前市场上的行情来说,一般情况下Python培训的费用 ...

  3. python全栈开发下载_python全栈开发神器 - 『精品软件区』 - 吾爱破解 - LCG - LSG |安卓破解|病毒分析|www.52pojie.cn...

    将安卓手机打造成你的python全栈开发利器 超神利器- 相信多数安卓用户都使用过Qpython这款移动端的Python编辑器吧?之前我也研究过一阵子这个工具,但因为一次简单的爬虫让我对它失望之极.Q ...

  4. python全栈开发网络_Python全栈开发:django网络框架(二)

    Model 到目前为止,当我们的程序涉及到数据库相关操作时,我们一般都会这么搞: 创建数据库,设计表结构和字段 使用 MySQLdb 来连接数据库,并编写数据访问层代码 业务逻辑层去调用数据访问层执行 ...

  5. python实现四位一并法_python 全栈开发,Day4(列表切片,增删改查,常用操作方法,元组,range,join)...

    一.列表 列表是python中的基础数据类型之一,它是以[]括起来,每个元素以逗号隔开,而且他里面可以存放各种数据类型比如: li = ['alex',123,Ture,(1,2,3,'wusir') ...

  6. python全栈开发内容_Python全栈开发之Day02

    一. 回顾上节主要内容 1. python是一门解释型弱类型高级语言 2. python的解释器 CPython, PyPy, JPython, IronPython, Ipython 3. prin ...

  7. python编程玩具有哪些_python 全栈开发,Day133(玩具与玩具之间的对话,基于jieba gensim pypinyin实现的自然语言处理,打包apk)...

    先下载github代码,下面的操作,都是基于这个版本来的! 注意:由于涉及到版权问题,此附件没有图片和音乐.请参考链接,手动采集一下! 请参考链接: 一.玩具与玩具之间的对话 app消息提醒 之前实现 ...

  8. python全栈开发中级_python全栈开发中级班全程笔记(第二模块)第一部分:文件处理...

    第二模块 第一部分:文件处理与函数 #插曲之人丑就要多读书:读书能够提高个人素质与内涵,提升个人修养与能力,以及层次的提升. 推荐书籍:追风筝的人.白鹿原 电影:阿甘正传.辛德勒的名单 第一节:三元运 ...

  9. python全栈开发网络_Python 全栈开发:网络编程

    一 socket 1.什么是socket 看一看图中socket的位置 Socket是应用层与TCP/IP协议族通信的中间软件抽象层,它是一组接口.在设计模式中,Socket其实就是一个门面模式,它把 ...

最新文章

  1. Windows 之 win10快捷键
  2. 《剑指offer》从上往下打印二叉树
  3. vamei java_java Vamei快速教程20 GUI
  4. Java代码总结【1】_查询手机号码归属地
  5. java 编辑二进制文件_java写二进制文件,不能直接编辑,该怎么操作?
  6. 有关javabean的说法不正确的是_7、关于JavaBean,下列叙述中不正确的是
  7. Three Tips
  8. 如何将数据库文件进行压缩
  9. 使用oledb读写excel出现“操作必须使用一个可更新的查询”的解决办法
  10. matlab数据行次序反转,如何在Excel表格中将数据顺序翻转-excel怎么把一行数据颠倒...
  11. iOS 设置tableview组头组尾的背景色
  12. matlab 比较两个函数,Matlab同时拟合两个函数 - 数学 - 小木虫 - 学术 科研 互动社区...
  13. 3D立方体图片切换动画
  14. 《自来水哲学-松下幸之助自传》读后感
  15. 机器学习——贝叶斯算法(一)
  16. ORACLE sqlplus命令
  17. Golang基于学习总结
  18. terraform import-导入已有资源到Terraform
  19. [机器学习]粒子群算法
  20. 国内外PLM/PDM厂商情况

热门文章

  1. 4.1.1 初识文件管理
  2. Volatile可见性
  3. 大佬把Spring框架总结的「无比详细」,不信你学不会!
  4. 有关算法方面的经典书籍推荐
  5. 【KVM系列06】Nova 通过 libvirt 管理 QEMU/KVM 虚机
  6. Eclipse.自动提示--编写HTML/CSS/JS/JSP代码时自动提示的解决办法
  7. 网络爬虫:基于对象持久化实现爬虫现场快速还原
  8. Python3.5入门到项目实战(104天课程)
  9. LinkedList插入元素一定比ArrayList快吗
  10. 最高效的回文数(C语言实现)