若为了与用户交互,有如下代码
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 innermessageOne = 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)
操作
现在大家已经初步掌握装饰器的用法了