Python学习之装饰器

装饰器出现的原因是因为我们应对新的需求:在不改变原函数调用方式的情况下,在这个函数前后加上扩展功能;它的本质是闭包函数。

装饰器的结构:

def timmer(func):
    def inner(*args,**kwargs):
        '''添加函数调用之前的扩展代码'''
        ret = func(*args,**kwargs)
        '''添加函数调用之后的扩展代码'''
        return ret
    return inner

两个def 两个return互相对应。

装饰器的设计模式:是开放封闭原则;既对扩展是开放的,对修改是封闭的。

计算一个函数的运行的时间:

import time
def timmer(func):
    #函数名可以当做函数的参数
    def inner():
        start = time.time()
        func()
        end = time.time()
        print(end - start)
    return inner

def hahaha():
    time.sleep(0.1)
    print('aaaa')

# hahaha()
timmer(hahaha)()

这个函数可以计算有限的代码运行时间,面对企业大规模的应用这种方法就不可行啦。需要用下面的方法:

import time
def timmer(func):
    #函数名可以当做函数的参数
    def inner():
        start = time.time()
        func()
        end = time.time()
        print(end - start)
    return inner

def hahaha():
    time.sleep(0.1)
    print('aaaa')

# hahaha()
#timmer(hahaha)()
#我们不能修改这个函数的调用方式
#也不能修改原代码
hahaha = timmer(hahaha)  #timmer函数的地址给了hahaha
hahaha()  #实际上执行的是timmer

这就是装饰器的简单应用。

我们需要对这个精简下:

import time
def timmer(func):
    #函数名可以当做函数的参数
    def inner():
        start = time.time()
        func()
        end = time.time()
        print(end - start)
    return inner
@timmer#语法糖必须紧跟着定义的函数
def hahaha():
    time.sleep(0.1)
    print('aaaa')

# hahaha()
#timmer(hahaha)()
#我们不能修改这个函数的调用方式
#也不能修改原代码
#hahaha = timmer(hahaha)  #timmer函数的地址给了hahaha
hahaha()  #实际上执行的是timmer

如果被装饰的函数有参数传入呢:

def timmer(func):  #---> hahaha
    def inner(*args,**kwargs):#可以接受任何传入的参数
        #args == (1,2)  kwargs == {}
        #*args == 1,2   **kwargs == a =1,b = 2
        func(*args,**kwargs)  # --->hahaha
    return inner


def kkk(a):
    print(a)

kkk = timmer(kkk)
kkk(1)

被装饰的函数有返回值呢,通过下面的方式可以解决:

def timmer(func):  #---> jjj
    def inner(*args,**kwargs):
        ret = func(*args,**kwargs)  # --->ret = jjj()
        return ret
    return inner


def jjj():
    return 123

jjj = timmer(jjj)
print(jjj())  #==>inner
原文地址:https://www.cnblogs.com/1a2a/p/7258034.html