Python学习基础笔记七十六——Python装饰器2

装饰器,英文名字decorator。

我们开发Python代码的时候,经常碰到装饰器。

通常被装饰后的函数,会在原来的函数的基础上,增加一些功能。

通常装饰器本事也是一个函数,那么装饰器是怎么装饰另外一个函数的呢?

假设,你进入一家公司,领导要求你在老代码的基础上继续开发。

import time
def getXXXTime():
    return time.strftime('%Y_%m_%d %H:%M:%S',time.localtime())

import time

# 定义一个装饰器函数
def sayLocal(func):
    def inner():
        ret = func()
        return f'当地时间: {ret}'
    return inner


def getXXXTime():
    return time.strftime('%Y_%m_%d %H:%M:%S',time.localtime())

# 装饰getXXXTime()
getXXXTime = sayLocal(getXXXTime)

print(getXXXTime())

Python学习基础笔记七十六——Python装饰器2_第1张图片 

我们再看下之前的装饰器的通用模板:

def wrapper(f):                    # 装饰器wrapper
    def inner(*args, **kwargs):  
        '''在装饰前要做的事情'''  
        ret = f(*args, **kwargs)   # 被装饰的函数
        '''在装饰后要做的事情'''
        return ret
    return inner

@wrapper                           # 装饰器函数名
def func(a, b):                    # 被装饰的函数

import time

# 定义一个装饰器函数
def sayLocal(func):
    def inner():
        ret = func()
        return f'当地时间: {ret}'
    return inner

@sayLocal
def getXXXTime():
    return time.strftime('%Y_%m_%d %H:%M:%S',time.localtime())

# 装饰getXXXTime()
# getXXXTime = sayLocal(getXXXTime)

print(getXXXTime())

sayLocal函数是一个装饰器,它装饰了参数函数的行为。

以@sayLocal开头后面接装饰器函数的这种写法,是一种语法糖,也就是便捷的写法。

装饰器经常被用在库和框架中,给别的开发者使用。

这些库的开发者预料到 使用者 开发的函数可能需要 一些增强的功能。

但是 这些库的开发者 没法去改使用者的代码, 就可以把这些增强的部分做在 装饰器函数中。

这样使用者,只需要在他们的函数前面上@xxx 就使用了这些增强的功能了。

开放封闭原则:

1)多拓展是开放的;

2)对修改是封闭的;

目的是维护代码的稳定性,这个就是装饰器存在的意义。

你可能感兴趣的:(Python,python)