python--装饰器(附偏函数、断言)

博客地址:http://www.cnblogs.com/yudanqu/
概念:装饰器是一个闭包,把一个函数当做参数返回一个替代版的函数,本质上就是一个返回函数的函数
装饰器就是在我们需要的一个函数外面包装一个外壳,当我们希望这个函数更漂亮时,可以通过改变这个包装的样子即可,而不需要更改原函数,也可以避免出错。
1、简单的装饰器
def func2(func):
def inner():
print('************')
func()
return inner def 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 = 0
func(age)
return inner def 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=''):
print('%s is %d years old,number is %s,gender:%d' % (name,age,number,gender))
func6('张三',18,0,'') # 函数的参数理论上是无限制的,但实际上最好不要超过6到7个
这个其实没有太多要说的,只是把参数换成了不定长参数
*args:可以接受不限量个参数,将他们打包成tuple给函数
**kwargs:可以将关键字参数打包成字典给函数
有了上面两个,那么几乎所有的参数都可以随便输入了。
4、最后再顺带说一下偏函数和断言,但这个不是重点:
'''
我理解为偏函数就是可以通过控制参数来实现功能
''' # 这样的一个功能,接下来实现它
print(int('', base = 2))
# base = 2 意思是把字符串当做二进制来计算,就是把这个字符串以二进制来判断他是多少,以十进制输出 # 第一种方法
def int2(str, base = 2): # 表示设置默认值为2.将来用base值来转换
return int(str, base) # 第二种方法(偏函数)
import functools # 这个模块帮我们定义偏函数
int2 = functools.partial(int, base = 2)
'''
断言
''' def func(num, div):
assert (div != 0), "div不能为0" # 断言
return num/div func(10, 0)
# 函数本身分母不为零,如果为零那么将报错,使用断言,当没有错误时不产生效果,当有错误时会告诉你哪里错了
作者:渔单渠(yudanqu)
博客地址:http://www.cnblogs.com/yudanqu/
python--装饰器(附偏函数、断言)的更多相关文章
- python装饰器的简单理解
如果你接触 Python 有一段时间了的话,想必你对 @ 符号一定不陌生了,没错 @ 符号就是装饰器的语法糖. 装饰器的使用方法很固定: 先定义一个装饰函数(帽子)(也可以用类.偏函数实现) 再定义你 ...
- 关于python装饰器
关于python装饰器,不是系统的介绍,只是说一下某些问题 1 首先了解变量作用于非常重要 2 其次要了解闭包 def logger(func): def inner(*args, **kwargs) ...
- python装饰器通俗易懂的解释!
1.python装饰器 刚刚接触python的装饰器,简直懵逼了,直接不懂什么意思啊有木有,自己都忘了走了多少遍Debug,查了多少遍资料,猜有点点开始明白了.总结了一下解释得比较好的,通俗易懂的来说 ...
- Python 装饰器学习
Python装饰器学习(九步入门) 这是在Python学习小组上介绍的内容,现学现卖.多练习是好的学习方式. 第一步:最简单的函数,准备附加额外功能 1 2 3 4 5 6 7 8 # -*- c ...
- python 装饰器修改调整函数参数
简单记录一下利用python装饰器来调整函数的方法.现在有个需求:参数line范围为1-16,要求把9-16的范围转化为1-8,即9对应1,10对应2,...,16对应8. 下面是例子: def fo ...
- python 装饰器学习(decorator)
最近看到有个装饰器的例子,没看懂, #!/usr/bin/python class decorator(object): def __init__(self,f): print "initi ...
- Python装饰器详解
python中的装饰器是一个用得非常多的东西,我们可以把一些特定的方法.通用的方法写成一个个装饰器,这就为调用这些方法提供一个非常大的便利,如此提高我们代码的可读性以及简洁性,以及可扩展性. 在学习p ...
- 关于python装饰器(Decorators)最底层理解的一句话
一个decorator只是一个带有一个函数作为参数并返回一个替换函数的闭包. http://www.xxx.com/html/2016/pythonhexinbiancheng_0718/1044.h ...
- Python装饰器由浅入深
装饰器的功能在很多语言中都有,名字也不尽相同,其实它体现的是一种设计模式,强调的是开放封闭原则,更多的用于后期功能升级而不是编写新的代码.装饰器不光能装饰函数,也能装饰其他的对象,比如类,但通常,我们 ...
- Python装饰器与面向切面编程
今天来讨论一下装饰器.装饰器是一个很著名的设计模式,经常被用于有切面需求的场景,较为经典的有插入日志.性能测试.事务处理等.装饰器是解决这类问题的绝佳设计,有了装饰器,我们就可以抽离出大量函数中与函数 ...
随机推荐
- 《Linux下FTP服务器搭建及FTP使用》
.LOGAndy:mxtd114 <Linux下FTP服务器搭建> 0.root登录 1.安装ftp # yum -y install ftp 2.安装vsftpd # yum -y in ...
- Python入门指南(超详细)
Python 是一门非常容易上手的语言,通过查阅资料和教程,也许一晚上就能写出一个简单的爬虫.但 Python 也是一门很难精通的语言,因为简洁的语法背后隐藏了许多黑科技.本文主要针对的读者是: 毫无 ...
- 快速开发框架,及库存管理系统,基于easyui框架和C#语言MVC、EntityFrameWork、T4模板技术。
快速开发框架,及库存管理系统,基于easyui框架和C#语言MVC.EntityFrameWork.T4模板技术. 产品界面如下图所示: 源码结构: 开放全部源码,如有需要请联系,QQ:1107141 ...
- CentOS-Minimal版本下安装telnet服务和xinetd服务
默认在CentOS-Minimal版本下没有安装telnet和xinetd服务. 1.安装telnet [root@localhost ~]# rpm -qa | grep telnet --检查是 ...
- Java多线程:生命周期,实现与调度
Java线程生命周期 Java线程实现方法 继承Thread类,重写run()方法 实现Runnable接口,便于继承其他类 Callable类替换Runnable类,实现返回值 Future接口对任 ...
- 5月第2周业务风控关注 | 央行:严禁未经授权认可的APP接入征信系统
本文由 网易云发布. 易盾业务风控周报每周呈报值得关注的安全技术和事件,包括但不限于内容安全.移动安全.业务安全和网络安全,帮助企业提高警惕,规避这些似小实大.影响业务健康发展的安全风险. 1.央行 ...
- JDK10都发布了,nio你了解多少?
前言 只有光头才能变强 回顾前面: 给女朋友讲解什么是代理模式 包装模式就是这么简单啦 本来我预想是先来回顾一下传统的IO模式的,将传统的IO模式的相关类理清楚(因为IO的类很多). 但是,发现在整理 ...
- CDH简易离线部署文档
CDH 离线简易部署文档 文档说明 本文为开发部署文档,生产环境需做相应调整. 以下操作尽量在root用户下操作,避免权限问题. 目录 文档说明 2 文档修改历史记录 2 目录 3 ...
- 夜神模拟器链接Android studoid
在cmd 窗口输入:adb.exe connect 127.0.0.1:62001然后as就自动匹配了夜神经常忘记,特此提醒
- PAT1112:Stucked Keyboard
1112. Stucked Keyboard (20) 时间限制 400 ms 内存限制 65536 kB 代码长度限制 16000 B 判题程序 Standard 作者 CHEN, Yue On a ...