若为了与用户交互,有如下代码
def messageOne():
print("今天天气是晴转多云")
def messageTwo():
print("今天的空气质量为优")
messageOne()
messageTwo()
现需在每条提示信息之前加上一条关于客户来自中国的信息,可改写为
def messageOne():
print("你好,来自中国的用户")
print("今天天气是晴转多云")
def messageTwo():
print("你好,来自中国的用户")
print("今天的空气质量为优")
messageOne()
messageTwo()
但这会造成代码冗余,有没有更好的方法?有的:
def messageOne():
print("今天天气是晴转多云")
def messageTwo():
print("今天的空气质量为优")
def addChina(func):
def inner():
print("你好,来自中国的用户")
func()
return inner
messageOne = addChina(messageOne)
messageTwo = addChina(messageTwo)
messageOne()
messageTwo()
这里需要用到一点函数变量的知识,可参考https://blog.csdn.net/qq_45812220/article/details/137741680?spm=1001.2014.3001.5501
总之,这段代码通过一个闭包操作,给原来的2个函数额外增加了新功能。
在此基础上,python提供了一种被称为语法糖的写法,以一种更简单的写法,实际实现相同的功能
def addChina(func):
def inner():
print("你好,来自中国的用户")
func()
return inner
def messageOne():
print("今天天气是晴转多云")
def messageTwo():
print("今天的空气质量为优")
messageOne()
messageTwo()
此处的两句@addChina
语句等效于实现了之前的
messageOne = addChina(messageOne)
messageTwo = addChina(messageTwo)
操作
现在大家已经初步掌握装饰器的用法了