上一篇的教程可查看https://blog.csdn.net/qq_45812220/article/details/137815537?csdn_share_tail=%7B%22type%22%3A%22blog%22%2C%22rType%22%3A%22article%22%2C%22rId%22%3A%22137815537%22%2C%22source%22%3A%22qq_45812220%22%7D
本篇为装饰器系列的最后一篇:含有参数的装饰器。先看代码:
def addSymbol(func):
def inner(*args,**kwargs):
print("-" * 30)
res = func()
return res
return inner
def message():
print("今天的天气是晴转多云")
message()
执行结果为
------------------------------
今天的天气是晴转多云
既,在原打印语句前加上分隔符-
。但是,如果我想将分隔符换为+
号呢?重新定义一个装饰器当然可以,但我们这里直接讨论带有参数的装饰器应该怎么做。
我们来看语句@addSymbol
,这一句我们之前讨论过,等效于message = addSymbol(message)
(当然,如果用这句语句来替换@addSymbol
,应该将该语句放在message
函数定义的后面才行),也就是说,这个语法糖等效于一个语句,而这个语句只能接收一个参数,而这个参数还正好是要被修饰的函数名。那么,就没有办法传递其他参数了吗?
我们可以将原先的装饰器定义在一个新函数getDecorator
中,让新函数根据接收的参数返回一个对应于想要添加符号的旧函数
def getDecorator(symbol):
def addSymbol(func):
def inner(*args, **kwargs):
print(symbol * 30)
res = func()
return res
return inner
return addSymbol
("+")
def message():
print("今天的天气是晴转多云")
message()
执行结果:
++++++++++++++++++++++++++++++
今天的天气是晴转多云
读者也可以将@getDecorator("+")
中的加号进行任意修改
至此,装饰器系列讲解完成。如有错误,欢迎指出