Python闭包装饰器使用方法汇总


Posted in Python onJune 29, 2020

闭包内容:

匿名函数:能够完成简单的功能,传递这个函数的引用,只有功能

普通函数:能够完成复杂的功能,传递这个函数的引用,只有功能

闭包:能够完成较为复杂的功能,传递这个闭包中的函数以及数据,因此传递是功能+数据

对象:能够完成最复杂的功能,传递很多数据+很多功能,因此传递的是数据+功能

———————————————————

对全局函数进行修改:在函数当中加global,在闭包中外边中的变量加nonlocal

闭包定义:有两个函数嵌套使用,里面的函数可以使用外面函数所传输的参数,最后可传递的是里面函数的结构与数据(个人理解)。

最后闭包可以在python中引申出装饰器 ———————————————————

def closure():
  # 在函数内部再定义一个函数,
  # 并且这个函数用到了外边函数的变量,那么将这个函数以及用到的一些变量称之为闭包
  def closure_in(x):
    print('---------我是打不死的%s--------' %x)
  return closure_in
​
x = closure()
x('小强')
​
print('*'*20)
# -----加餐---------
def closure_1(a,b,c):
  def closure_on(x):
    print('-----%s加餐-------' %b)
    print(a*x + c)
  return closure_on
​
demo = closure_1(2,'小强',3) #传closure_1函数
demo(4) #传clsure_on函数
​
#注:函数不加括号,调用的是函数本身【function】;函数加括号,调用的是函数的return结果。

装饰器内容:

代码要遵守‘开放封闭'原则;对已经写好的函数遵守封闭,对功能扩展遵守开放;

# 装饰器的作用:为了对原来的代码上进行扩展
def decoration(func):
  def call_func():
    print('-------正在装饰 -------' )
    func()
  return call_func
​
#@decoration   #--->demo_new = decoration(demo)
def demo():
  print('demo----')
​
demo_new = decoration(demo)
demo_new()

使用装饰器来测试一个函数的运行时:

import time
def set_func(func):
  def call_func():
    start_time = time.time()
    func()
    stop_func = time.time()
    print(‘alltimes is %f' %(stop_func-start_fun))
  return call_func
@set_func
def test1():
  print(‘——-test1———')
test1()
​
#等价于:
@set_func==test1 = set_func(test1)

1. 没有参数,没有返回值的函数进行装饰:

def set_func(func):
  def call_func():
    print(‘———test2——-')
    print(‘———-test3——')
    func()
  return call_func

@set_func
def test1():
  print(‘——test1——-  ')

2. 对有参数无返回值的函数进行装饰:

def set_func(func):
  def call_func(a): #变
    print(‘———test2——-')
    print(‘———-test3——')
    func(a) #变
  return call_func

@set_func
def test1(num):
  print(‘——test1——- %d  ' %num)
​
test1(100) —->call_func(100)
test1(200)——>call_func(200)

复现装饰器原理:

————————————————————————-

只要遇到@函数 装饰器(这句话),在程序中就已经执行了!!

3. 不定长参数的函数装饰:

def set_func(func):
  def call_func(*args,**kwargs): #变
    print(‘———test2——-')
    print(‘———-test3——')
    func(*args,**kwargs) #(拆包)将元祖拆开,每个进行传输;
    #func(args,kwargs)—>不行,相当于传递了两个参数:一个元祖,一个字典。
  return call_func
@set_func
def test1(num,*args,**kwargs):
  print(‘——test1——- %d  ' %num)
  print(‘——test1——-  ' , args)
  print(‘——test1——- ' ,kwargs )
test1(100)
test1(100,200)
test1(100,200,300,mm=100)

注意:*args保存不定长参数,以元祖保存,**kwargs保存字典形式(mm=...)

4.对应的返回值参数进行装饰、通用装饰器:

#通用装饰器
def set_func(func):
  print(“开始进行装饰———-”)
  def call_func(*args,**kwargs): #变
    print(‘———test2——-')
    print(‘———-test3——')
    return func(*args,**kwargs) #(拆包)将元祖拆开,每个进行传输;如果没有return ret返回none。
    #func(args,kwargs)—>不行,相当于传递了两个参数:一个元祖,一个字典。
  return call_func

@set_func
def test1(num,*args,**kwargs):
  print(‘——test1——- %d  ' %num)
  print(‘——test1——-  ' , args)
  print(‘——test1——- ' ,kwargs )
  return ‘ok'  #—-返回给上面的func(),然后return func—ret
ret = test1(100)

5. 多个装饰器对同一个函数进行装饰:

def add_qx(func):
  print(“——开始进行装饰权限1———-”)
  def call_func(*args,**kwargs): #变
    print(‘这是权限验证1')
    return func(*args,**kwargs)
  return call_func

​
def add_xx(func):
  print(“——开始进行装饰xx功能———-”)
  def call_func(*args,**kwargs): #变
    print(‘这是xx权限验证')
    return func(*args,**kwargs)
  return call_func
@add_qx
@add_xx
def test1():
  print(‘——test1——-')
test1()

首先执行第一个,但是第一个装饰器下面不是函数(装饰器原则:下面必须是函数,否则不执行),所以第一个函数先等待,等第二个装饰器执行后形成函数在交给第一个装饰器;所以运行结果是:

开始进行装饰xx的功能,

开始进行装饰权限1,

这是权限验证1,

这是xx权限验证,

——-test1——-,

——————装饰器练习—————- 输出格式:<td><h1>haha</h1></td>

def set_func_1(func):
  def call_func():
    return ‘<h1>' + func() + '</h1>'
  return call_func

​
def set_func_2(func):
  def call_func():
    return ‘<td>' + func() + '</td>'
  return call_func

@set_func_1()
@set_func_2()
def get_str():
  return ‘haha'

print(get_str())
最后执行的效果: <h1><td>haha</td></h1>

6. 用类对函数进行装饰(了解):

class Test(object):
  def __init__(self,func):
    self.func = fun

  def __call__(self):
    print(‘这里是装饰器的功能。。。。')
    return self.func()

@Test
def get_str():
  return ‘haha'

print(get_str())

以上就是装饰器与闭包的全部内容

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
python写的一个squid访问日志分析的小程序
Sep 17 Python
在Python中使用Mako模版库的简单教程
Apr 08 Python
简介Django中内置的一些中间件
Jul 24 Python
python用模块zlib压缩与解压字符串和文件的方法
Dec 16 Python
详解Python字典小结
Oct 20 Python
python使用matplotlib画柱状图、散点图
Mar 18 Python
Python定时发送天气预报邮件代码实例
Sep 09 Python
简述 Python 的类和对象
Aug 21 Python
python字典通过值反查键的实现(简洁写法)
Sep 30 Python
使用Django实现商城验证码模块的方法
Jun 01 Python
Python编程编写完善的命令行工具
Sep 15 Python
Python 视频画质增强
Apr 28 Python
使用已经得到的keras模型识别自己手写的数字方式
Jun 29 #Python
Python接口测试环境搭建过程详解
Jun 29 #Python
python字典的值可以修改吗
Jun 29 #Python
python怎么自定义捕获错误
Jun 29 #Python
python打开文件的方式有哪些
Jun 29 #Python
解决tensorflow/keras时出现数组维度不匹配问题
Jun 29 #Python
python中如何写类
Jun 29 #Python
You might like
锁定年轻人的双倍活力 星巴克推出星倍醇即饮浓咖啡
2021/03/03 咖啡文化
PHP脚本中include文件出错解决方法
2008/11/20 PHP
PHP 数组基础知识小结
2010/08/20 PHP
深入掌握include_once与require_once的区别
2013/06/17 PHP
PHP实现图片旋转效果实例代码
2014/10/01 PHP
PHP那些琐碎的知识点(整理)
2017/05/20 PHP
PHP如何获取当前主机、域名、网址、路径、端口等参数
2017/06/09 PHP
Easy.Ajax 部分源代码 支持文件上传功能, 兼容所有主流浏览器
2011/02/24 Javascript
JS面向对象基础讲解(工厂模式、构造函数模式、原型模式、混合模式、动态原型模式)
2014/08/16 Javascript
JavaScript字符串对象toUpperCase方法入门实例(用于把字母转换为大写)
2014/10/17 Javascript
JS简单限制textarea内输入字符数量的方法
2015/10/14 Javascript
AngularJS基础 ng-list 指令详解及示例代码
2016/08/02 Javascript
jquery对象和DOM对象的相互转换详解
2016/10/18 Javascript
微信小程序 使用canvas制作K线实例详解
2017/01/12 Javascript
JavaScript实现的商品抢购倒计时功能示例
2017/04/17 Javascript
Angular中使用$watch监听object属性值的变化(详解)
2017/04/24 Javascript
webpack打包后直接访问页面图片路径错误的解决方法
2017/06/17 Javascript
Vue列表页渲染优化详解
2017/07/24 Javascript
Vue之Vue.set动态新增对象属性方法
2018/02/23 Javascript
vue element项目引入icon图标的方法
2018/06/06 Javascript
js实现随机数小游戏
2019/06/28 Javascript
H5 js点击按钮复制文本到粘贴板
2020/11/19 Javascript
解决启动django,浏览器显示“服务器拒绝访问”的问题
2020/05/13 Python
tensorflow dataset.shuffle、dataset.batch、dataset.repeat顺序区别详解
2020/06/03 Python
利用python清除移动硬盘中的临时文件
2020/10/28 Python
简洁自适应404页面HTML好看的404源码
2020/12/16 HTML / CSS
“型”走纽约上东区:Sam Edelman
2017/04/02 全球购物
完美实现CSS垂直居中的11种方法
2021/03/27 HTML / CSS
幼师专业求职推荐信
2013/11/08 职场文书
销售副总经理岗位职责
2013/12/11 职场文书
行政工作个人的自我评价
2014/02/13 职场文书
党员个人整改方案及措施
2014/10/25 职场文书
2015年五一劳动节演讲稿
2015/03/18 职场文书
酒店温馨提示语
2015/07/14 职场文书
公司安全管理制度范本
2015/08/05 职场文书
求职信如何撰写?
2019/05/22 职场文书