python之路--装饰器函数

(一)装饰器的形成过程

装饰器的本质是闭包函数的一种应用,装饰器是用来装饰函数的,在不修改原函数及其调用方式的情况下对原函数功能进行拓展。

 

#简单的无参函数装饰器
import time
def timmer(func):
    def inner():
        start = time.time()
        func()
        end = time.time()
        print(end -start)
    return inner 
@timmer#语法糖
def hahaha():
    time.sleep(2)#停止时间的一种用法
    print("a")
hahaha()
#简单的有参函数装饰器
import time
def timmer(func):
    def inner(x,y):
        start = time.time()
        func(x,y)
        end = time.time()
        print(end -start)
    return inner
@timmer
def hahaha(a,b):
    time.sleep(2)#停止时间的一种用法
    print("aaa")
hahaha(1,2)
#简单的带返回值的装饰器
import time
def timmer(func):
    def inner(*args,**kwargs):
        start = time.time()
        se = func(*args,**kwargs)
        end = time.time()
        print(end - start)
        return se
    return inner
@timmer
def func2(a):
     print("in func and get a:%s"%(a))
     return "fun2 over"
func2([1,2,3,4,5])

装饰器的主要功能和装饰器的固定结构

装饰器的主要功能:

在不改变原函数及其调用方式的基础上在函数的前,后增加功能。

装饰器的固定格式:

#完美的装饰器格式
def wrapper(func):
    def inner(*args,**kwargs):
        '''执行之前要做的'''
        re = func(*args,**kwargs)
        '''执行函数之后要做的'''
        return re
    return inner

带参数的装饰器

#装饰器多层嵌套
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("hello world")#装饰器也可传参
def func(a,b):
    print(111)
func(1,3)

开放封闭原则

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

2,对修改是封闭的,我们写的一个函数,很有可能已经交付给其他人使用了,如果这个时候我们对其修改了,很有可能影响其他已经在使用该函数的用户。

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

多个装饰器装饰同一个函数

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,before func")
    return inner
@wrapper1
@wrapper2
def f():
    print("in f")
f()

 

posted on 2017-07-27 17:39  keepDoing  阅读(205)  评论(0编辑  收藏  举报

导航