前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >python基础-装饰器

python基础-装饰器

作者头像
以谁为师
发布2019-05-28 20:30:53
3000
发布2019-05-28 20:30:53
举报
文章被收录于专栏:小网管的运维之路

装饰器

我们到了新的阶段了,也是逃不过的一劫,装饰器,有的兄弟们估计听说过,这可是一个神奇的东西,

在认识它之前我们先来回顾一下闭包

代码语言:javascript
复制
def func1():
    name = "alex"
    def func2():
        print(name)
        # 闭包
    func2()
func1()

这就是闭包,那刚刚说一个很神奇的东西,为什么又说闭包了呢? 机智的铁子们已经猜到,装饰器和闭包是有点关系的,是滴没错.

那什么是装饰器呢?装饰器是干什么的呢?

现在你在公司,领导让你写一个函数,来测试另一个函数的执行效率,你怎么做?

代码语言:javascript
复制
先引入时间概念。
import time
def func():
    print('嘻嘻更健康')
import time
start_time = time.time()
time.sleep(0.1)
func()
end_time = time.time()
print('----> 执行效率%s'%(end_time - start_time))

上面你已经写完了,但是你应该放在函数中,这样减少重复代码,可读性好,ok继续做。

代码语言:javascript
复制
def func():
    print('嘻嘻更健康')
def timmer(f):
    start_time = time.time()
    time.sleep(0.1)
    f()
    end_time = time.time()
    print('----> 执行效率%s'%(end_time - start_time))

好你又写完了,但是执行之前的函数只是func(),而你写玩了这个之后,还得加一步timmer(func),如果要是领导让你测试500个函数的执行效率呢?好,你又进一步改,如下

代码语言:javascript
复制
func()
f1 = func  # func
func = timmer  # timmer
func(f1)
将他的执行结果改了一下,这样看似func(f1)与原来的调用差不多,但是加了好几步,而且添加了f1参数。。。

现在你请教了我,我说来,写个装饰器就能解决。

代码语言:javascript
复制
def timmer(f):  #小花
    def inner():  # 小红
        start_time = time.time()
        time.sleep(0.1)
        f()
        end_time = time.time()
        print('----> 执行效率%s' % (end_time - start_time))
    return inner

def func(): #小刚
    print("is func")
func = timmer(func)  # inner
func() # inner()

这样,就写好了,这是最简单的装饰器,装饰任何函数,只需要加一句func = timmer(func)

肯定有人在想,这一堆鬼东西是什么啊,慢 别急往下看.兄弟我说的是往下看文章,不是看你下边

func函数是小刚,timmer函数是小花,inner函数是小红.小花和小红是非常好的闺蜜

小刚对小红一直暗生情愫,直到有一天憋不住了想和小红说但是,又想知道小红对他什么看法所以小刚找到了小花

然后把他的想法和小花说了,小花然后问小红你觉得小刚怎么样.小红说很好啊,我还挺喜欢他的,然后小花就把小红的话告诉了小刚,小刚听了这句话很是激动,然后就直接去找小红和小红进行表白了.

代码语言:javascript
复制
#简单的装饰器
def func():
    print('嘻嘻更健康')
def timmer(f):
    def inner():
        start_time = time.time()
        time.sleep(0.1)
        f()
        end_time = time.time()
        print('----> 执行效率%s' % (end_time - start_time))
    return inner
func = timmer(func)  # inner
func() # inner()

但是Python认为你这个还是不简单,所以Python给你提供了一个更见的方式就是语法糖。

代码语言:javascript
复制
#语法糖 @  

def timmer(f):

    def inner():

        start_time = time.time()

        time.sleep(0.1)

        f()

        end_time = time.time()

        print('----> 执行效率%s' % (end_time - start_time))

    return inner

@timmer  # func = timmer(func) 

语法糖的拆解

@装饰器函数 == 重新定义被装饰函数=装饰器函数(被装饰函数)

代码语言:javascript
复制
def func():
    print('嘻嘻更健康')
func() # inner()
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2019年5月14日,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 装饰器
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档