有个需求

加法的函数就完成加法即可,没必要print,如果减法,你也加了print,print你就可以写成参数
对add来讲,跟主要功能没有关系,是附加的功能,需要的时候加上,不需要的时候摘掉,写死了就是硬编码
但是一般add函数就做add
打印不是该你负责的事情,但是如果又需要你有这个功能,就很矛盾

想要变成一种附加的或者增强的功能,需要就加,不需要就忽略
** __name__就是这个函数对象是什么名字**
这样写还是有很多好处的,相当于通用的了,add的主要业务是不包含打印的,这样打印就成为一种附加的功能,不是它的主要业务改成xy就把参数搞定了
想要这两个也通用,也打印
函数传参有两种,关键字和位置传参,不管keyword-only还是其他,传参只有两种方式

还需要解构

上面的是形参定义,下面是参数解构,两码事(疑问,这样传就符合要求 了吗)

具体参数对不对还是需要fn来管,这个参数对不对不是以你的logger来决定的,由你原来的业务函数fn来决定实参是不是它想要的,fn(*args)解构之后相当于add(4,5)
输入的参数对不对,是用add来判断的,
可不可把b打印一下
logger函数只是记录一下并不对之前的信息做任何修改


开始柯里化
整体向右挪,先让外层调用内存


logger(add)返回函数,给fn 调用fn(),到目前为止做了一次柯里化

进一步做处理,把这一块单独拿开

现在针对add函数研究

*既然成功执行说明add是可以被覆盖的,那么原来的add消失了吗
下面的add,等于赋值即重新定义,这个标识符相当于记录inner函数对象
add (4,5)相当于调用inner(4,5)传给args了
该打印打印
fn(
args)4,5在这里解开,fn还记得这个之前的add函数,形成了闭包,原来的add爱谁谁

这个闭包的fn记录着曾经的add对应的内存中的函数对象
传递,4,5,返回9 ret=9,返回给你

用到了嵌套函数,作用域,闭包,还用到了函数定义的本质,还用到了可变参数,参数解构

再做一次变形,装饰器,复制一下,准备修改这段代码

这个地方@logger 等价为logger(add)=>add就是inner
logger是个函数,前面加@符号,就能将下面函数的标识符,作为参数传进来
add作为参数,logger(add)赋给同名标识符add
相当于给logger函数传参数,计算来的结果赋值给同名的标识符add
所以add 就等于inner


fn记得add,所以传进去,4,5相加
但是用的时候logger函数需要放在前面,否则后面@使用的时候会报错的
直接执行相当于定义两个函数,没有调用,相当于inner函数没有调用
在调用的过程中,你以为调用的是add实际调用的是inner,会给你一些功能增强,而且不影响原来的功能,这个就是装饰器

wrapper包装者,add就是被包装者
装饰器一般不改变原来的功能


add原来没有print功能,给它增强,可变参数,参数解构,之后用到柯里化,变成2层函数,调用的方式就改变了,
做等价
等价之后,才做了装饰器语法
这是个装饰器例子,必须看懂,
写的时候可以把等价式写在后面


把名称前面加add,就能把下面的标识符,提进来作为参数,它的返回值会重新覆盖这个标识符,至于覆盖之后看你怎么写,


参数写死 先改变成下面,包括如何解构
换一种写法写成这样,柯里化就能写成这样
写成另外的形态,因为有闭包,原来的fn记住了add

有 了这种写法就可以用装饰器语法,不过函数定义要调个顺序

装饰器的logger会把下面的标识符作为参数,并且得到的值赋给这个add标识符
无参装饰器
这一处的装饰器定义是不准确的,只是方便理解
现在来看,
装饰器是一个函数,
函数作为它的形参
返回值也是一个函数
可以使用@functionname方式,简化调用
实际上是个高阶函数


在函数调用之前可以做一些增强,函数调用后也可以做一些增强,最后函数的返回值
这就是稍微全面点的装饰器的写法

主要功能由业务函数完成,缺什么填什么,函数封装,各司其职,不互相干扰

可以通过这个功能,简单记录函数的耗时时间
写代码最后执行的肯定都是函数
尤其执行慢的函数必须要知道
现在就可以在某些函数上面加个装饰器就完了,就可以通过这个简单记录,来表现系统的问题在哪里


装饰器实际上就是画框,画框就是装饰器函数,加的就是被包装函数(被增强),画
要在前面加玻璃板,后面加底称,前功能增强,后置功能增强,拿画框卡起来
,这个装饰器是没有破坏原来的函数的
明天不需要可以拿掉,安装另外的功能,但是装饰器可以套装饰器
可以理解为外面黑画框,外面套红画框,里面画还是本身,只不过加了装饰而已

装饰器是对原有函数功能进行一些增强,一般情况下不会改变原来函数的功能,不会在函数内部进行任何硬编码

2019/10/09 02-无参装饰器***相关推荐

  1. python中的无参装饰器和有参装饰器

    python中的无参装饰器和有参装饰器 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 装饰器特点: 1>.开放封闭原则,即对扩展是开放的,对修改时封闭的: 2>.装饰器 ...

  2. 装饰器,语法糖.有参装饰器 ,无参装饰器

    装饰器 什么是装饰器 一种为其他函数增加新功能的函数就是装饰器 装饰器基于闭包函数实现 器,指的就是一种工具,例如生活中,打孔器 装饰,指的是给某个已存在的对象添加装饰品 装饰的目的是为了给这个被装饰 ...

  3. 在Python中的无参装饰器和有参装饰器

    装饰器特点: 1.开放封闭原则,即对扩展是开放的,对修改时封闭的: 2.装饰器本质可以是任意可调用的对象,被装饰的对象也可以是任意可调用对象: 3.装饰器的功能是在不修改被装饰器对象源代码以及被装饰器 ...

  4. python无参数装饰器_python_之无参装饰器_01

    # 1:提问:什么是装饰器? # 解答:根据字面意思可以理解,装饰器就是用来装饰函数的工具. # # 2:装饰器有什么特点? # 解答:(1) 装饰器原则:开放封闭原则. 解释==>开放是指,对 ...

  5. Python无参装饰器

    需求:想要在test_func函数前后执行一些代码   1.第一步(定义函数,将调用原函数,使用新函数替换) def test_func():return 'test_func'def test_wr ...

  6. python学习Day14 带参装饰器、可迭代对象、迭代器对象、for 迭代器工作原理、枚举对象、生成器及生成表达式...

    复习 函数的嵌套定义:在函数内部定义另一个函数 闭包:被嵌套的函数 -- 1.外层通过形参给内层函数传参 -- 2.返回内部函数对象---->  延迟执行, 开放封闭原则: 功能可以拓展,但源代 ...

  7. React之函数式组件和高阶组件(装饰器、带参装饰器)

    import React from 'react'; // 此句不能少 import ReactDom from 'react-dom';const Wrapper = props => < ...

  8. Python基础教程:带参装饰器、生成器、迭代器、for循环迭代器、枚举

    带参装饰器 装饰器为被装饰的函数添加新功能,需要外界参数 outer参数固定一个,就是func inner参数固定和被装饰的参数固定,也不能添加新参数 可以借助函数的嵌套定义,外层给内层传参 def ...

  9. python教程:有参装饰器

    由于语法糖@的限制,outter函数只能有一个参数,并且该才是只用来接收被装饰对象的内存地址 def outter(func):def wrapper(*args,**kwargs):res=func ...

最新文章

  1. 利用存储过程完成定时备份数据
  2. echart x轴 倾斜_1次加工28个零件,这就是为什么5轴机床这么牛:
  3. 【SpringBoot】SpringBoot拦截器实战和 Servlet3.0自定义Filter、Listener
  4. uda 3.C++二维向量
  5. php实训总结00字,说明的比较细的php 正则学习实例
  6. 功能Java示例 第8部分–更多纯函数
  7. 相似邻里算法_纽约市-邻里之战
  8. 直播丨Oracle 12.2系列安装
  9. Assignment 双向队列
  10. java int转integer方法
  11. Spark(Core)
  12. 飞桨2.0高层api教程——使用BERT实现自动写诗
  13. 关于Video.js 出现的问题 this.el_.vjs_getProperty
  14. vs下活动解决方案管理器中x86 x64 win32 anycpu arm的区别
  15. python定义变量取值范围_python怎么限定函数自变量取值范围?
  16. 晨控可视化标签在资产管理上的应用及优势
  17. 解决Visio中Mathtype公式插入Word或复制后变形
  18. 欢迎来到地狱(隐写术)
  19. JavaScript中的触发事件
  20. Excel 2010 VBA 入门 098 导入Access数据库的数据

热门文章

  1. 深度学习环境功能以及安装流程
  2. jsp实现网页照相功能
  3. RiPro主题高端美化设计素材软件下载站子主题
  4. 微信小程序 如何把小程序页面保存至用户相册
  5. Love Love Love
  6. docker镜像打包上传
  7. JS 常见面试题 - 事件循环机制
  8. OFFICE1:EXCEL、WPS表格数据处理,三种多列合并为一列,用法和原理详解。
  9. linux的filesystem
  10. Python爬虫设置代理