python里面有个装饰器的概念,大体上来说就是在某个函数外部包裹一些逻辑,这个功能就叫做装饰器。苏南大叔准备分几篇文章来解释一下python装饰器的概念,装饰器是如何在给定函数的外部包裹附加逻辑代码的。

苏南大叔:python代码,如何理解装饰器decorators?基本概念 - python装饰器
python代码,如何理解装饰器decorators?基本概念(图5-1)

大家好,这里是苏南大叔的程序如此灵动博客,这里记录苏南大叔和计算机代码的故事。本文描述python装饰器的基本概念。测试环境:win10python@3.6.8

基本概念示意

装饰器的作用就是在已有的函数外部包裹一些附加逻辑,下面的代码是个简单的演示,但下面的代码并不是真正的装饰器:

def buy(goods="食品饮料"):
    print("买了"+goods)

def go_shopping():
    print("准备购物清单")
    buy()
    print("买完打包回家")

go_shopping()

苏南大叔:python代码,如何理解装饰器decorators?基本概念 - 基本概念
python代码,如何理解装饰器decorators?基本概念(图5-2)

装饰器的基本写法

这里假设go_shopping是装饰器的话,它在buy前后都添加了逻辑。但是,上面的并不是真正的装饰器。如果变成python下的装饰器的话,就是下面的样子:

def go_shopping(func):
    def anyname(name="瓜子"):
        print("准备购物清单")
        func(name)
        print("买完打包回家")
    return anyname

@go_shopping
def buy(goods="食品饮料"):
    print("买了"+goods)

buy()

这里的关键词是定义在目标函数顶部的@符号字符串,它把go_shopping这个装饰器叠加到了函数buy上面。并且装饰器必须在使用之前被定义,也就是说这里的顺序很重要,否则报错:

@go_shopping
NameError: name 'go_shopping' is not defined

苏南大叔:python代码,如何理解装饰器decorators?基本概念 - 定义顺序很重要
python代码,如何理解装饰器decorators?基本概念(图5-3)

合适的装饰器写法

事实上,装饰器这里要求:装饰器里面的参数和被包裹的函数的参数,个数是一致的。否则会报错,类如如下:

def go_shopping(func):
    def anyname(name="瓜子"):
        print("准备购物清单")
        func(name)
        print("买完打包回家")
    return anyname

@go_shopping
def buy2():
    print("买2")

buy2(

报错如下:

func(name)
TypeError: buy2() takes 0 positional arguments but 1 was given

这个例子中,本来没有啥问题的普通函数,被叠加了装饰器之后,因为装饰器里面的参数处理的问题,所以报错了。

苏南大叔:python代码,如何理解装饰器decorators?基本概念 - 参数列表需要一致
python代码,如何理解装饰器decorators?基本概念(图5-4)

那么,结合上一篇文章的内容,可以把这里的装饰器里面的参数列表换成*args,**kwargs,这样的话,实用性就更强了。

def go_shopping3(func):
    def anyname(*args,**args2):
        print("准备购物清单")
        func(*args,**args2)
        print("买完打包回家")
    return anyname

@go_shopping3
def buy3():
    print("买3")

buy3()

苏南大叔:python代码,如何理解装饰器decorators?基本概念 - 处理参数
python代码,如何理解装饰器decorators?基本概念(图5-5)

相关链接

总结

装饰器是python里面的新概念,在java里面也有类似的概念。更多python相关概念,请点击下面的链接:

如果本文对您有帮助,或者节约了您的时间,欢迎打赏瓶饮料,建立下友谊关系。
本博客不欢迎:各种镜像采集行为。请尊重原创文章内容,转载请保留作者链接。