储备知识:

1、 *args, **kwargs

def index(x,y):print(x,y)def wrapper(*args,**kwargs):index(*args,**kwargs)
#wrapper(222,111)

2、名称空间与作用域:名称空间的的"嵌套"关系是在函数定义阶段,即会检测语法的错误

def func():print(x)x = 111func()

3、函数对象:

  • 可以把函数当做参数传入
  • 可以把函数当做返回值返回
'''
遇到问题没人解答?小编创建了一个Python学习交流QQ群:778463939
寻找有志同道合的小伙伴,互帮互助,群里还有不错的视频学习教程和PDF电子书!
'''
def func():print(x)
x = 111def index():return 123def foo(func):return funcfoo(index)

4、函数的嵌套定义:

def outter(func):def wrapper():passreturn wrapper 

闭包函数

def outter():x = 0def wrapper():nonlocal xx += 1return xreturn wrapperwrapper = outter()
print(wrapper())

传参的方式一:通过参数的形式为函数体传值

'''
遇到问题没人解答?小编创建了一个Python学习交流QQ群:778463939
寻找有志同道合的小伙伴,互帮互助,群里还有不错的视频学习教程和PDF电子书!
'''
def wrapper(x):print(1)print(2)print(3)xwrapper(1)
wrapper(2)
wrapper(3

传参的方式二:通过闭包的方式为函数体传值

def outter(x):def wrapper():print(1)print(2)print(3)xreturn wrapperwrapper=outter(1)
print(wrapper())

装饰器:装饰器指的定义一个函数,该函数是用来为其他函数添加额外的功能

开放封闭原则

  • 开放:指的是对拓展功能是开放的
  • 封闭:指的是对修改源代码是封闭的
# 需求:在不修改index函数的源代码以及调用方式的前提下为其添加统计运行时间的功能
def index(x,y):time.sleep(3)print('index %s %s' %(x,y))index(111,222)

解决方案一:失败

问题:没有修改被装饰对象的调用方式,但是修改了其源代码

'''
遇到问题没人解答?小编创建了一个Python学习交流QQ群:778463939
寻找有志同道合的小伙伴,互帮互助,群里还有不错的视频学习教程和PDF电子书!
'''
import timedef index(x,y):start=time.time()time.sleep(3)print('index %s %s' %(x,y))stop = time.time()print(stop - start)index(111,222)

解决方案二:失败
问题:没有修改被装饰对象的调用方式,也没有修改了其源代码,并且加上了新功能
但是代码冗余

import timedef index(x,y):time.sleep(3)print('index %s %s' %(x,y))start=time.time()
index(111,222)
stop=time.time()
print(stop - start)start=time.time()
index(111,222)
stop=time.time()
print(stop - start)

解决方案三:失败

问题:解决了方案二代码冗余问题,但带来一个新问题即函数的调用方式改变了

import timedef index(x,y):time.sleep(3)print('index %s %s' %(x,y))def wrapper():start=time.time()index(111,222)stop=time.time()print(stop - start)wrapper()

方案三的优化一:将index的参数写活了

'''
遇到问题没人解答?小编创建了一个Python学习交流QQ群:778463939
寻找有志同道合的小伙伴,互帮互助,群里还有不错的视频学习教程和PDF电子书!
'''
import timedef index(x,y,z):time.sleep(3)print('index %s %s %s' %(x,y,z))def wrapper(*args,**kwargs):start=time.time()index(*args,**kwargs) stop=time.time()print(stop - start)wrapper(3333,4444,5555)

方案三的优化二:在优化一的基础上把被装饰对象写活了,原来只能装饰index

import timedef index(x,y,z):time.sleep(3)print('index %s %s %s' %(x,y,z))def home(name):time.sleep(2)print('welcome %s to home page' %name)def outter(func):def wrapper(*args,**kwargs):start=time.time()func(*args,**kwargs) stop=time.time()print(stop - start)return wrapperindex=outter(index)
home=outter(home)

方案三的优化三:将wrapper做的跟被装饰对象一模一样,以假乱真

'''
遇到问题没人解答?小编创建了一个Python学习交流QQ群:778463939
寻找有志同道合的小伙伴,互帮互助,群里还有不错的视频学习教程和PDF电子书!
'''
import timedef index(x,y,z):time.sleep(3)print('index %s %s %s' %(x,y,z))def home(name):time.sleep(2)print('welcome %s to home page' %name)def outter(func):def wrapper(*args,**kwargs):start=time.time()res=func(*args,**kwargs)stop=time.time()print(stop - start)return resreturn wrapperhome=outter(home)

语法糖:在被装饰对象正上方的单独一行写@装饰器名字

import time
# 装饰器
def timmer(func):def wrapper(*args,**kwargs):start=time.time()res=func(*args,**kwargs)stop=time.time()print(stop - start)return resreturn wrapper@timmer
def index(x,y,z):time.sleep(3)print('index %s %s %s' %(x,y,z))@timmer
def home(name):time.sleep(2)print('welcome %s to home page' %name)index(x=1,y=2,z=3)
home('egon')

总结无参装饰器模板

def outter(func):def wrapper(*args,**kwargs):# 1、调用原函数# 2、为其增加新功能res=func(*args,**kwargs)return resreturn wrapper

Python储备知识与装饰器相关推荐

  1. python return用法_初学Python要了解什么 装饰器知识汇总有哪些

    初学Python要了解什么?装饰器知识汇总有哪些?在Python学习过程中,有多种方法对函数和类进行加工,相对于其它方式,装饰器语法简单,代码可读性高.因此,装饰器在Python项目中有广泛的应用,比 ...

  2. python类装饰器详解-Python类中的装饰器在当前类中的声明与调用详解

    我的Python环境:3.7 在Python类里声明一个装饰器,并在这个类里调用这个装饰器. 代码如下: class Test(): xx = False def __init__(self): pa ...

  3. [转载] Python学习笔记——用装饰器decorator和Memoization记忆化提高效率,原理讲清楚了

    参考链接: 在Python中使用装饰器进行记忆 Python学习笔记--用装饰器decorator和Memoization记忆化提高效率 装饰器Memoization记忆化运用`functools`中 ...

  4. itext生成pdf paragraph 自动换行_reportlab高级制作多格式PDF和python的class和装饰器复习

    1 说明 1.1 reportlab高级制作多格式PDF:即包含文字.表格.柱状图. 1.2 复习python的class和装饰器的高级基础知识. 1.3 列表转换字符串.读取txt文件等python ...

  5. 第7.26节 Python中的@property装饰器定义属性访问方法getter、setter、deleter 详解

    第7.26节 Python中的@property装饰器定义属性访问方法getter.setter.deleter 详解 一.    引言 Python中的装饰器在前面接触过,老猿还没有深入展开介绍装饰 ...

  6. python log函数_python装饰器的使用

    1. 装饰者模式 装饰者模式是常用的软件设计模式之一.通过此设计模式,我们能够在不修改任何底层代码情况下,给已有对象赋予新的职责.python中可以用装饰器简单地实现装饰者模式. 1.1 将函数作为参 ...

  7. Python中的decorator装饰器使用方法

    装饰器的运用是Python编程中的一项高级技巧,这里由浅入深,整理了12步入门Python中的decorator装饰器使用方法,需要的朋友可以参考下 装饰器(decorator)是一种高级Python ...

  8. python实现计时器(装饰器)

    1, Python时间装饰器_BurningSilence的博客-CSDN博客_python 时间装饰器 from functools import wraps import time# time装饰 ...

  9. 一文搞懂Python知识难点------装饰器

    1.装饰器的本质 装饰器本质上是一个闭包函数,可以让其它函数在不需要任何代码变动的前提下增加额外功能,装饰器的返回值也是一个函数. 闭包函数 1)必须是嵌套函数,即外函数中定义了一个内函数: 2)内函 ...

最新文章

  1. 2022-2028年全球与中国闪光棉市场研究及前瞻分析报告
  2. c#_按值传递与按引用传递的区别
  3. 简明docker教程 1
  4. ubuntu java classpath_java – 如何为Ubuntu中的文件夹设置CLASSPATH变量
  5. log4j中配置日志文件相对路径方法
  6. 使用Synergy多台电脑共享键盘鼠标和剪贴板
  7. 14 张Python数据科学速查表
  8. php变量的数据类型
  9. 流程制造项目中关于销售订单数量与实际产生数量不同时的解决方案
  10. centos安装redis并客户端连接_网络共享打印机图文教程,电脑客户端连接安装设置共享打印机方法...
  11. 正确的初始化,在 Java 编程中至关重要!
  12. 【路径规划】基于matlab改进的粒子群算法路径规划【含Matlab源码 491期】
  13. ulipad.4.1.zip linux,在ubuntu中安装ulipad
  14. N720实现4G的TCP连接,数据上云的方法
  15. 数据库查询近一年来的数据(近三个月、近六个月同理)
  16. Window 10 激活 命令行操作
  17. 装上这几款IDEA插件,专业程度提升妥妥的
  18. Keepalived常用配置及脚本
  19. 【读书笔记】《王道论坛计算机考研机试指南》第五章
  20. BugTags使用教程

热门文章

  1. 一个css和js结合的下拉菜单,支持主流浏览器
  2. IIS不支持apk文件下载问题
  3. 基于模板引擎的代码生成器Smart Code预览
  4. 【学习笔记】SAP FI 业务范围的概念
  5. 【Demo】采购订单收货Bapi
  6. 【修正】销售开票BAPI实例:BAPI_BILLINGDOC_CREATEMULTIPLE
  7. 【PP操作手册】计划订单转生产订单
  8. SAP 主生产计划(MPS)
  9. WDA将改变现有的abap的开发方式
  10. sap可配置BOM的主要流程