初学 Python(十五)——装饰器

初学 Python(十五)——装饰器

 

  初学 Python,主要整理一些学习到的知识点,这次是生成器。

#-*- coding:utf-8 -*-  
import functools  
def current():  
    print 'nihao'  
current()  
g = current  
g()  
#函数有默认字段__name__(2个下划线)  
print current.__name__  
print g.__name__  
  
  
''''' 
装饰器的定义 
在不改变某个函数的内部代码的情况下 
在执行函数的前后加上一些逻辑 
称作装饰器 
'''  
#举例,在current函数运行前打印一行日志  
  
def log(func):  
    def wrapper(*args,**kw):  
        print 'call %s()'%func.__name__  
        return func(*args,**kw)  
    return wrapper  
 
@log  
def current2():  
    print 'nihao'  
  
current2()  
  
''''' 
看例解疑: 
当给current2函数加上@log后 
会发现current2执行前先打印了call current2() 
这是因为装饰器的调用相当于把后面跟的函数放进了 
装饰器里面去了.上面执行current2步骤: 
1.执行current2(),返回wrapper() 
2.执行wrapper(),打印call current2(),得到current2() 
3.执行current2(),打印'nihao' 
'''  
  
#上面的@log定义等同于下面的形式  
#current2 = log(current2)  
current2()  
print 'current2函数名:'  
print current2.__name__  
  
#上面的装饰器本身不带参数,为2层嵌套.  
#如何要带参数,那就要3层嵌套,先获得参数  
def logt(text):  
    def log(func):  
        @functools.wraps(func)  
        def wrapper(*args,**kw):  
            print '%s %s():'% (text,func.__name__)  
            return func(*args,**kw)  
        return wrapper  
    return log  
@logt('execute')  
def current3():  
    print 'nihaoa'  
print '调用装饰器logt:'  
current3()  
  
''''' 
上面的写法很容看出来执行的步骤 
1.执行current3(),得到log() 
然后就跟之前的顺序一样 
'''  
#@logt定义等同下面的形式  
#current3 = logt('execute')(current3)  
#但是你会发现它打印的信息中有wrapper函数  
#而且函数名称也变为了wrapper  
print '执行经过装饰器改装后的current3:'  
current3()  
  
print 'current3函数名:'  
print current3.__name__  
#这是什么原因,我也不知道#正在理解中  
  
#解决方法是加上这么一句@functools.wraps(func)就解决啦  

 

转载于:https://www.cnblogs.com/Boohee/p/6159718.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值