python基础-装饰器

2019年5月14日 ⋅ 浏览量: 57   


装饰器

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

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

def func1():
    name = "alex"
    def func2():
        print(name)
        # 闭包
    func2()
func1()

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

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

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

先引入时间概念。
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继续做。

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个函数的执行效率呢?好,你又进一步改,如下

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

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

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函数是小红.小花和小红是非常好的闺蜜

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

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

#简单的装饰器
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给你提供了一个更见的方式就是语法糖。

#语法糖 @  

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) 

语法糖的拆解

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

def func():
    print('嘻嘻更健康')
func() # inner()


目录


标签 Tags


     扫码加入运维圈



微信打赏

作者: 以谁为师

最后更新: 2019年5月14日

原始链接: http://attacker.club/detail/119.html

转载本文请注明出处





    留言区:


    暂无评论