博客地址:http://www.cnblogs.com/yudanqu/

  概念:装饰器是一个闭包,把一个函数当做参数返回一个替代版的函数,本质上就是一个返回函数的函数

  装饰器就是在我们需要的一个函数外面包装一个外壳,当我们希望这个函数更漂亮时,可以通过改变这个包装的样子即可,而不需要更改原函数,也可以避免出错。

1、简单的装饰器

def func2(func):def inner():print('************')func()return innerdef func1():print("this is one")f = func2(func1)
f()  

  下面我解释一下这个装饰器,可以看到,func1是我们真正需要的函数,这时候我们想在输出这个函数时再多添加一些功能,那么我们就需要对func1这个函数进行装饰。func2是一个外部的输出函数,他的参数是func,这只是个形参,使用的时候将需要装饰的函数传入即可,当我们执行func2这个函数的时候,其内部还有一个函数inner(),但是里面inner只是创建了这个函数而没有被调用(这个大家能理解吗,就是我们在定义一个函数时,他不会自动被调用,我们使用他时需要人为的通过这个函数来调用一下)内部读取代码仅读到def inner()这里并不进去,继续向下就到了return inner,这里返回了内部的那个函数名,但也只是个名字没有被调用(函数名后面加上小括号才可以调用)。那么return返回给谁呢,就给了下面的f,用f来接收func2的return值,现在f就是return的inner。进行最后一步,调用inner,上一步我们已经知道f就是inner,调用他就加个小括号就可以了。调用了inner函数后,他的内部有func()这个函数,并且调用了,所以可以直接执行func内的语句块。func就是最外面传进来的参数,也就是我们需要被装饰的函数。小伙伴们慢慢理一下思路,一定要把第一个理清楚了,那么后面就轻而易举了。

2、装饰器进阶(含有一个参数)

def func4(func):def inner(age):if age < 0:age = 0func(age)return innerdef func3(age):
print("this is two %d" % age)f = func4(func3)f(-7)                

  看一下,这个框架和第一个几乎一样对吧,唯独多了一个参数,这个参数是最后由我们装饰的那个函数来使用,由最外部传入。我们把参数给在了inner函数,这是为什么呢?我们想一下,我们装饰的函数是在什么时候调用的,是不是在调用了inner函数后,inner函数内自动调用的啊。那么在调用inner函数时才调用的目标函数,我们不就应该把目标函数的参数从这里传进去吗(最外层的函数是个包装的作用,他是为了返回inner函数的地址,来为之后调用inner做准备),我们在用f接收这个inner函数,我们调用他还需要加个小括号f(),这才是调用inner,既然这里调用,正好有个传入参数的接口,我们趁着这个机会把想要实现的func3函数的参数扔进去,岂不美哉,接下来我们执行func3函数的时候,只需要把上面接收到的参数再传到自己的接口里就好了。

22、改进

@func4
def func3(age):print("this is two %d" % age)
# 这时就可以直接使用原来的func3函数了,不需要引入变量来接收,就已经可以使用装饰器里的内容
func3(-7)

  @符号是装饰器的语法糖,在定义函数时,可以避免赋值操作

  那么这段代码有什么作用呢?

  其实他可以替换掉上方代码的后四行,代码中最开始的装饰器是一样的,我们改进在使用装饰器上。上面我们通过先定义一个目标函数,然后把他作为参数传入装饰器里,然后用一个变量f来接收,最终调用f()来实现装饰作用,这样是不是繁琐了点呢,我们做了这么多工作,而且可能会把我们搞晕,其中还引入了变量,当代码很长时,那么多的变量我们怎么记得住呢。这时就有了语法糖。大约在python2.4就开始可以使用@符号了。也许大家见过,有时候会有@staticmethod,@classmethod的字眼,这就是python的内置装饰器。

  @func4的作用就是替代了上方在装饰器里传参数然后赋值的过程,可以理解为通过这样一个符号,就已经把自己变成装饰了之后的样子,那么我们再使用的时候,只需要和以往一样,调用函数,传参就可以了。当然是不是真正的变了,当下方再次使用这个函数时,如果不添加语法糖还会是函数自己。

  但此时的装饰器只能接收一个参数,为整形,因为内部使用了判断,这样的话我们很多事情就不是很方便了,使用装饰器就是方便我们进行后续的操作,这样的话我们使用不一样的功能还得总是修改装饰器。那么,我们继续向下看。

3、进进阶装饰器(通用装饰器)

def func5(func):def inner(*args,**kwargs):# 功能print("&&&&&&")func(*args,**kwargs)return inner@func5
def func6(name,age,gender=1,number='00000000'):print('%s is %d years old,number is %s,gender:%d' % (name,age,number,gender))
func6('张三',18,0,'05162002')# 函数的参数理论上是无限制的,但实际上最好不要超过6到7个    

  这个其实没有太多要说的,只是把参数换成了不定长参数

    *args:可以接受不限量个参数,将他们打包成tuple给函数

    **kwargs:可以将关键字参数打包成字典给函数

  有了上面两个,那么几乎所有的参数都可以随便输入了。

4、最后再顺带说一下偏函数和断言,但这个不是重点:

 1 '''
 2 我理解为偏函数就是可以通过控制参数来实现功能
 3 '''
 4
 5 # 这样的一个功能,接下来实现它
 6 print(int('1010', base = 2))
 7 # base = 2 意思是把字符串当做二进制来计算,就是把这个字符串以二进制来判断他是多少,以十进制输出
 8
 9 # 第一种方法
10 def int2(str, base = 2): # 表示设置默认值为2.将来用base值来转换
11     return int(str, base)
12
13 # 第二种方法(偏函数)
14 import functools # 这个模块帮我们定义偏函数
15 int2 = functools.partial(int, base = 2)

 1 '''
 2 断言
 3 '''
 4
 5 def func(num, div):
 6     assert (div != 0), "div不能为0" # 断言
 7     return num/div
 8
 9 func(10, 0)
10 # 函数本身分母不为零,如果为零那么将报错,使用断言,当没有错误时不产生效果,当有错误时会告诉你哪里错了

  作者:渔单渠(yudanqu)

  博客地址:http://www.cnblogs.com/yudanqu/

转载于:https://www.cnblogs.com/yudanqu/p/9091826.html

python--装饰器(附偏函数、断言)相关推荐

  1. python装饰器与偏函数

    一.什么是偏函数? (1)在Python的functools模块众多的功能中,其中有一个就是偏函数,我们称之为 partial function 模块的概念我们下一篇在细讲. (2)我们都听过偏将军吧 ...

  2. python函数式编程:匿名函数,装饰器,偏函数

    一 匿名函数: 尽管python的语法已经很简洁,但是定义函数的过程还是相对繁琐,当我们在调用函数的过程中,python为我们提供了可以节省定义函数时间的方法,让我们可以不用显示的调用函数,那就是匿名 ...

  3. python装饰器原理-简单了解python装饰器原理及使用方法

    这篇文章主要介绍了简单了解python装饰器原理及使用方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 如果你接触 Python 有一段时间了的话 ...

  4. python装饰器简单理解_python装饰器的简单理解

    如果你接触 Python 有一段时间了的话,想必你对 @ 符号一定不陌生了,没错 @ 符号就是装饰器的语法糖. 装饰器的使用方法很固定: 先定义一个装饰函数(帽子)(也可以用类.偏函数实现) 再定义你 ...

  5. python 装饰器的讲解

    所谓装饰器就是把函数包装一下,为函数添加一些附加功能,装饰器就是一个函数,参数为被包装的函数,返回包装后的函数  装饰器本身就是一个函数, 将所装饰的函数, 作为一个参数传进来, 然后在执行这个函数之 ...

  6. python装饰器传参与不传参_Python装饰器不会传参?别着急,这篇文章为你解惑

    本文始发于个人公众号:TechFlow,原创不易,求个关注 今天是Python专题的第13篇文章,上一篇文章当中我们介绍了Python装饰器的定义和基本的用法,这篇文章我们一起来学习一下Python装 ...

  7. Python|装饰器|执行时间|递归|动态属性|静态方法和类|继承和多态|isinstance类型判断|溢出|“魔法”方法|语言基础50课:学习记录(6)-函数的高级应用、面向对象编程、进阶及应用

    文章目录 系列目录 原项目地址: 第16课:函数的高级应用 装饰器(记录执行时间的例子) 递归调用 简单的总结 第17课:面向对象编程入门 类和对象 定义类 创建和使用对象 初始化方法 打印对象 面向 ...

  8. python简单装饰器_简单介绍Python装饰器(一)

    装饰器的作用 相信大家在 探索过程中已经了解装饰器的作用,也有很多花里胡哨的介绍. 这次小冰也来讲解一下关于Python装饰器的一些小知识. 它的作用: 性能测试 日志 安全验证 ...... 相信大 ...

  9. Python装饰器的神奇功能:自动打印每个方法耗时

    问题: 运行代码时,尤其对于大型项目需要分析每个环节方法耗时的.每个方法前后都写计算耗时及日志打印太繁琐了,而且代码不精简. 解决: Python装饰器类似于Spring的 AOP(Aspect Or ...

  10. python装饰器教学_Python装饰器学习(九步入门)

    这是在Python学习小组上介绍的内容,现学现卖.多练习是好的学习方式. 第一步:最简单的函数,准备附加额外功能 # -*- coding:gbk -*- '''示例1: 最简单的函数,表示调用了两次 ...

最新文章

  1. Linux上的WebSphere MQ开发快速入门
  2. c语言:将一个二维数组行和列的元素互换,存到另一个二维数组中。
  3. sql distinct 去重复 (mysql)
  4. xrkmonitor监控mysql_xrkmonitor字符云监控系统
  5. [转] 硬盘工具DiskMan使用图解
  6. 交叉编译及linux简单程序设计,嵌入式实验6交叉编译及Linux简单程序设计实验
  7. pandas指南:做更高效的数据科学家
  8. 注意力测试软件系统,儿童注意力训练评估软件 - 训练评估软件 - 唯普诺心理,心理测评系统,心理测评软件,婴幼儿智能发育,心理软件...
  9. nginx上配置phpmyadmin
  10. linux 时间戳计数器,使用TSC(时间戳计数器)计算时间
  11. python票务系统_列车票务系统
  12. Node.js跨域请求解决方案
  13. html异步 post,Jquery中Ajax/Post同步和异步请求
  14. 从源码分析HashSet集合
  15. 从全然不知到融会贯通 ——对小猿搜题手机APP的教学设计分析
  16. python与ffmepg结合进行ts文件的下载和合并,密钥文件解决方法
  17. 没有对手的人生是孤单的
  18. 【python 走进NLP】机器学习和深度学习情感分类模型
  19. Omega network
  20. 脑皮质算法(3)-- 新皮层的位置:利用皮层网格细胞的感觉运动物体识别理论

热门文章

  1. 计算机网络——IP地址与MAC地址
  2. 大数据WEB阶段Spring框架 AOP面向切面编程(二)
  3. Exp2 后门原理与实践 20164309
  4. 【STM32】窗口看门狗相关类型和函数
  5. python全栈开发要学些什么_如何迅速学习Python 全栈开发?
  6. php多态实现,PHP面向对象之旅:PHP的多态
  7. fpga在线升级 linux_仅5000行Verilog代码、可在FPGA上跑轻量级Linux系统的RISC-V内核
  8. WinXP下 扫雷程序逆向分析 --扫雷辅助(一)
  9. 51nod 1101 换零钱 完全背包的变型 动态规划
  10. menuetos oracle,使用DistroTest服务免费在线测试Linux和Unix操作系统