python装饰器的使用 @decorator

1、使用‘@’来使用decorator
2、注意装饰器的使用顺序
3、"@deco" ,“deco(myfunc())” 只是效果一致,但类型不同
4、如果直接deco(myfunc())调用,方法名带()作为参数,但是在创建decorator时,参数为方法名,不带()
5、装饰器中是两层方法调用,应该是为了避免死循环,可以尝试一层调用就知道了

创建一个装饰器
import time
# 思考下为什么装饰器中是两层方法调用呢?
def deco(func):
    def wrapper():
        starttime = time.time()
        func()
        endtime = time.time()
        msecs = (endtime - starttime)*1000
        print (">elapsed time: %f ms" % msecs)
    return wrapper
    
# def wrapper(func):
#     print('+++')
#     func()
#     print('---')
#     return wrapper
#   返回自己导致无限调用自己

#调用装饰器
@deco
def myfunc():
    print 'starttime'
    time.sleep(0.6)
    print 'endtime'


print "myfunc is ",myfunc.__name__

myfunc()
deco(myfunc())  # 虽然效果一致,但是type并不相同,参考下面代码
多层装饰器的装饰规则
#个人称其为:就近原则
@second
@first
def myfunc():
	pass
myfunc() 
second(first(myfunc()))  # 虽然效果一致,但是type并不相同,参考下面代码
它们type并不相同

执行:

a = myfunc()
print(type(a))
b = deco(myfunc())
print(type(b))
print(a==b)

结果:

<class 'NoneType'>
<class 'function'>
False
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值