首页 > 代码库 > Python D9 and D10

Python D9 and D10

装饰器

一、本质

装饰器的本质就是一个闭包函数,因此具有闭包函数的一切功能。可以在不改变原代码的情况下,在这个函数上扩展功能。

二、装饰器的形成

装饰器就是为了扩展其他函数功能而添加的函数。

举个最简单的例子:

import time

def func1():
    print(‘in func1‘)

def timer(func):
    def inner():
        start = time.time()
        func()
        print(time.time() - start)
    return inner

func1 = timer(func1)
func1()

然而大家可以看出,在使用装饰器时的赋值非常麻烦,每用一次就要进行一次赋值。为了解决这个问题就引入了一个新的概念:语法糖。

import time
def timer(func):
    def inner():
        start = time.time()
        func()
        print(time.time() - start)
    return inner

@timer   #==> func1 = timer(func1)
def func1():
    print(‘in func1‘)


func1()

  大家可以看出,只要在定义一个函数的时候在上面紧贴的位置加一个@解释器的结构就可以在调用函数的时候直接加上了,是不是非常方便?接下来引入三个概念

1.装饰器——带参数的装饰器

def timer(func):
    def inner(a):
        start = time.time()
        func(a)
        print(time.time() - start)
    return inner

@timer
def func1(a):
    print(a)

func1(1)

2.装饰器—万能装饰器

import time
def timer(func):
    def inner(*args,**kwargs):
        start = time.time()
        re = func(*args,**kwargs)
        print(time.time() - start)
        return re
    return inner

@timer   #==> func1 = timer(func1)
def func1(a,b):
    print(‘in func1‘)

@timer   #==> func2 = timer(func2)
def func2(a):
    print(‘in func2 and get a:%s‘%(a))
    return ‘fun2 over‘

func1(‘aaaaaa‘,‘bbbbbb‘)
print(func2(‘aaaaaa‘))

3.装饰器—带返回值的装饰器

import time
def timer(func):
    def inner(*args,**kwargs):
        start = time.time()
        re = func(*args,**kwargs)
        print(time.time() - start)
        return re
    return inner

@timer   #==> func2 = timer(func2)
def func2(a):
    print(‘in func2 and get a:%s‘%(a))
    return ‘fun2 over‘

func2(‘aaaaaa‘,‘bbbbbb‘)
print(func2(‘aaaaaa‘))

三、开放封闭原则

1.对扩展是开放的

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

2.对修改是封闭的

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

四、装饰器的固定格式

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

五、多个装饰器装饰一个函数

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

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

@qqxing
@pipixia
def f():
    print(‘in f‘)

f()

  这个过程就像是一层套一层一样,一层层的执行

Python D9 and D10