python装饰器使用
看了不少python关于装饰器文章,觉得还挺实用,发贴来mark一下(以前做笔记总会长时间不看就忘记,放这里应该不会忘了吧 - -)
先来看一个简单的知识点:
def a():
print("I'm a") #a 代表这个函数,在Python中函数名只是个指向函数首地址的函数指针而已
a() #执行函数
ok,接下来开始讲装饰器,看下面的小例子:
def a(func):
print("a running!")
return func @a
def b():
print("b running!") b()
当python读到@a的时候,其实执行的相当于 b=a(b),将下面的函数作为参数带入执行。这样我们在带入读下是不是变得很简单了,就是将b作为参数带入函数a中执行,再把函数a返回的结果赋值给b,等于重新定义了函数b;再来看内部的执行过程:
直接从@a开始,@a <==> b=a(b)
1.执行参数为b的a函数,打印“a running”
2.返回b,并将b赋值给b(这样也等于啥也没变!)所以也没有什么卵用!接下来我们再看一个开发中常用到的示例
示例2:
def a(b):
print("a running!")
def c():
print("c running!")
return b()
return c @a
def b():
print("b running!") b()
再看看这个函数的执行过程:
1.先将@a <==> b=a(b) ,相当于函数b等于被重新定义为a(b)的返回结果,
2.跳转a(b)的执行过程,先打印a running! 说明a运行了,接下来定义一个函数c,没啥输出,因为还没调用这个函数!注意这里的c函数return的b()的不是一个函数了啊,而是这个函数执行的结果,是将这个函数的结果作为返回值!这么做是有原因的(请看最后)
3.接下来才是return一个函数c,是不是相当于b=c(这就很有用了,在不改变函数b的情况下拓展了b的功能,真爽啊!)
所以最后这个b被定义成了这样:
b=def c():
print("c runing!")
return b()
4.再来执行b(),看看是不是输出了 c running !,又运行b()作为返回结果给调用者,当然函数b没有定义返回内容额,所以只运行了b()
最后解释下为什么要用return b(),return b()是运行b(),然后将返回的结果再返回,
这样想想看,没有使用装饰器之前,我调用b()是不是就是返回b()的结果啊,
现在加上装饰器,返回的是不是依然是b()的结果,这样对外看来我们调用b好像完全没有改变,但是实际上b在运行之前已经运行了我们的拓展功能了。。。不得不说666啊
总的来看其实主要就是@a 等价于 b=a(b) 理解了这个就ok啦,好处就是在不影响b函数的情况下,因为执行b还是返回原来的b返回的内容,增加了b函数的功能,是不是挺方便!!
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装饰器与面向切面编程
今天来讨论一下装饰器.装饰器是一个很著名的设计模式,经常被用于有切面需求的场景,较为经典的有插入日志.性能测试.事务处理等.装饰器是解决这类问题的绝佳设计,有了装饰器,我们就可以抽离出大量函数中与函数 ...
- python装饰器方法
前几天向几位新同事介绍项目,被问起了@login_required的实现,我说这是django框架提供的装饰器方法,验证用户是否登录,只要这样用就行了,因为自己不熟,并没有做过多解释. 今天查看dja ...
随机推荐
- (28000): Access denied for user 'root'@'127.0.0.1' (using password: YES)
在一台测试服务器测试Python脚本时,执行Python脚本时报如下错误: 主要错误信息为"operation the sql fail!1045 (28000): Access den ...
- HI3531网络tftp、nfs加载
ifconfig eth0 hw ether 00:00:23:34:45:66; ifconfig eth0 192.168.1.10 netmask 255.255.255.0; route a ...
- 利用Eclipse中的Maven构建Web项目报错(二)
利用Eclipse中的Maven构建Web项目 1.错误描述 [INFO] Scanning for projects... [INFO] [INFO] Using the builder org.a ...
- tcp为什么要三次握手,而不能二次握手?
谢希仁版<计算机网络>中的例子是这样的,"已失效的连接请求报文段"的产生在这样一种情况下:client发出的第一个连接请求报文段并没有丢失,而是在某个网络结点长时间的滞 ...
- Linux显示一行显示列总计
Linux显示一行显示列总计 youhaidong@youhaidong-ThinkPad-Edge-E545:~$ free -t total used free shared buffers ca ...
- 微软依赖注入Unity
Unity是一个依赖注入(Dependency Injection,DI)容器.DI的标准描述文章来自Martin Flower[0].作为一个快速的摘要,依赖注入容器就是一个用于构建高度松耦合的软件 ...
- WPF基础篇之空间布局
由于之前自己做的都是大多是B/S架构的项目,加入新公司,公司现在用的WPF,在WPF中一个比较重要的知识点:布局 在网上找到一篇比较好的介绍WPF布局的文章. 文章地址:http://www.cnbl ...
- 【Luogu1414】又是毕业季II(数论)
[Luogu1414]又是毕业季II(数论) 题面 题目背景 "叮铃铃铃",随着高考最后一科结考铃声的敲响,三年青春时光顿时凝固于此刻.毕业的欣喜怎敌那离别的不舍,憧憬着未来仍毋忘 ...
- Bzoj4916: 神犇和蒟蒻
题面 传送门 Sol 第一问puts("1") 第二问,\(\varphi(i^2)=i\varphi(i)\) 设\(\phi(n)=\sum_{i=1}^{n}i\varphi ...
- linux优化项
Linux优化: 1.建立普通账号,使用普通用户登陆. 2.处理SELINUX. 3.处理防火墙. 4.精简开机自启动服务.保留sshd,network,crond,rsyslog,sysstat. ...