有个需求

加法的函数就完成加法即可,没必要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. matlab 将矩阵中的0置为Inf(邻接矩阵)
  2. 1. 定义方法,求出指定元素在数组中出现的次数.
  3. 买了套房28年后才想起来,房价从33万涨到600万!上门却发现住着人?
  4. 【2019.08.21】2019杭电多校第十场
  5. app测试和app接口测试要点详解
  6. design php 如何使用ant_Ant Design Pro如何调用接口 | Ant Design Pro渲染数据 绑定数据...
  7. ASP.NET中 Repeater 的使用前台绑定
  8. 51单片机定时器问题总结
  9. 计算机图形学期刊影响因子,计算机图形学 | CCF推荐期刊专刊信息2条
  10. 软件开发生命周期的管理
  11. graphpad做单因素方差分析_如何使用Graphpad做单因素方差分析
  12. 用计算机将复数转换成角度,卡西欧FX-991ES计算器能计算电路里的复数加减乘除然后换算成角度吗?...
  13. 机器学习sklearn----支持向量机SVC模型评估指标
  14. GEF 命令模式介绍
  15. 第十五篇:大球联赛与小球联赛
  16. Cocoa Touch Layer
  17. Java计算两个日期相差的月数
  18. 第2章 中小型网络系统总体规划与设计
  19. STM32 学习笔记4-智能小车-超声波避障
  20. 共赴数智金融未来,2023数智金融峰会即将召开

热门文章

  1. 世界冠军Rui Cost的战车
  2. 英格兰进了六个球都看到了?为什么今年世界杯不卡了?
  3. python长整型怎么用_Python整型:布尔型、标准整型、长整型操作实例
  4. vivado chipscope
  5. STVD 安装出现“Microsoft Visual C++ 2005 Redistributable”提示,无法进一步安装
  6. 一款打击感超强的动作游戏《流星蝴蝶剑》
  7. PerformanceCounter 基本介绍以及示例方法
  8. 函数的this指向,call,apply bind改变this指向
  9. 618过后,一地鸡毛!UB Store助力商家“善后”
  10. 2021年深圳龙岗区龙腾计划专项扶持申报时间及奖励,补贴5000万