python代码,如何理解装饰器decorators?基本概念
发布于 作者:苏南大叔 来源:程序如此灵动~ 我们相信:世界是美好的,你是我也是。平行空间的世界里面,不同版本的生活也在继续...
python
里面有个装饰器的概念,大体上来说就是在某个函数外部包裹一些逻辑,这个功能就叫做装饰器。苏南大叔准备分几篇文章来解释一下python
装饰器的概念,装饰器是如何在给定函数的外部包裹附加逻辑代码的。
大家好,这里是苏南大叔的程序如此灵动博客,这里记录苏南大叔和计算机代码的故事。本文描述python
装饰器的基本概念。测试环境:win10
,python@3.6.8
。
基本概念示意
装饰器的作用就是在已有的函数外部包裹一些附加逻辑,下面的代码是个简单的演示,但下面的代码并不是真正的装饰器:
def buy(goods="食品饮料"):
print("买了"+goods)
def go_shopping():
print("准备购物清单")
buy()
print("买完打包回家")
go_shopping()
装饰器的基本写法
这里假设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
合适的装饰器写法
事实上,装饰器这里要求:装饰器里面的参数和被包裹的函数的参数,个数是一致的。否则会报错,类如如下:
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
这个例子中,本来没有啥问题的普通函数,被叠加了装饰器之后,因为装饰器里面的参数处理的问题,所以报错了。
那么,结合上一篇文章的内容,可以把这里的装饰器里面的参数列表换成*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
里面的新概念,在java
里面也有类似的概念。更多python
相关概念,请点击下面的链接:
如果本文对您有帮助,或者节约了您的时间,欢迎打赏瓶饮料,建立下友谊关系。
本博客不欢迎:各种镜像采集行为。请尊重原创文章内容,转载请保留作者链接。
本博客不欢迎:各种镜像采集行为。请尊重原创文章内容,转载请保留作者链接。