Python基础11(函数装饰器)

函数装饰器

  import time 模块

    time.sleep()  让程序在执行到这个位置的时候停一会

    time.time()  获取当前时间

       @timmer    语法糖  ==  func = timmer(func)

    语法糖使用方法

 1 import time
 2 def timer(func):
 3     def inner(*args,**kwargs):
 4         start = time.time()
 5         re = func(*args,**kwargs)
 6         print(time.time() - start)
 7         return re
 8     return inner
 9 
10 @timer   #==> func2 = timer(func2)
11 def func2(a):
12     print('in func2 and get a:%s'%(a))
13     return 'fun2 over'
14 
15 func2('aaaaaa','bbbbbb')
16 print(func2('aaaaaa'))

  装饰器的主要功能

     在不改变函数调用方式的基础上在函数的前、后添加功能。

   装饰器固定格式

1 def timer(func):
2     def inner(*args,**kwargs):
3         '''执行函数之前要做的'''
4         re = func(*args,**kwargs)
5         '''执行函数之后要做的'''
6         return re
7     return inner

  开放封闭原则

    1.对扩展是开放的

    为什么要对扩展开放呢?

    我们说,任何一个程序,不可能在设计之初就已经想好了所有的功能并且未来不做任何更新和修改。所以我们必须允许代码扩展、添加新功能。

    2.对修改是封闭的

    为什么要对修改封闭呢?

    就像我们刚刚提到的,因为我们写的一个函数,很有可能已经交付给其他人使用了,如果这个时候我们对其进行了修改,很有可能影响其他已经在使用该函数的用户。

    装饰器完美的遵循了这个开放封闭原则。

  带参数装饰器

def outer(flag):
    def timer(func):
        def inner(*args,**kwargs):
            if flag:
                print('''执行函数之前要做的''')
            re = func(*args,**kwargs)
            if flag:
                print('''执行函数之后要做的''')
            return re
        return inner
    return timer

@outer(False)
def func():
    print(111)

func()

  多个装饰器装饰一个函数

def wrapper1(func):
    def inner():
        print('wrapper1 ,before func')
        func()
        print('wrapper1 ,after func')
    return inner

def wrapper2(func):
    def inner():
        print('wrapper2 ,before func')
        func()
        print('wrapper2 ,after func')
    return inner

@wrapper2
@wrapper1
def f():
    print('in f')

f()

结果:显示现象为!

  2 1 1 2

posted @ 2017-12-28 17:30  争-渡  阅读(113)  评论(0)    收藏  举报