在Python中,修饰器(也称为装饰器)是一个高级Python功能,它允许你修改或增强函数、方法或类的行为,而无需修改其源代码。修饰器本质上是一个接受函数作为参数的可调用对象(通常是另一个函数),并返回一个新的函数对象。
一般想要给源代码增添功能,需要修改其源代码:
import timedef Demo():print('hello')time.sleep(1)print('python')
上面为原始代码,如果想要给其增添新的功能,如计算代码执行时间,常规操作为:
import timedef Demo():start_time = time.time()print('hello')time.sleep(1)print('python')end_time = time.time()result = end_time - start_timeprint('程序执行时间为:%s秒'%result)
那么,如果在不修改源代码的情况下,给其增添新的功能,就需要用到我们装饰器了:
import timedef Demo(func):def demo1():start_time = time.time()func()end_time = time.time()result = end_time - start_timeprint('程序执行时间为:%s秒'%result)return demo1@Demo
def time_operation():print("hello")time.sleep(1)print("python")if __name__ == '__main__':a = time_operationa()print("a.__name__ is:%s\n" % a.__name__)
控制台输出:
说明:
在这个例子中,Demo是一个修饰器函数,它接受一个函数 func
作为参数,,并返回一个新的函数 demo1。通过使用@Demo语法,我们将 Demo应用到 time_operation上,从而在不修改 time_operation 源代码的情况下增强了其行为。
当调用 time_operation()
时,实际上调用的是修饰器返回的 demo1函数,因此会打印出执行时间。
到这里我们可能会想到,在项目中如果我们多使用几个装饰器可行嘛,答案是当然可以,我们一起往下来看看:
import timedef Demo(func):print("ddddd") def demo1():start_time = time.time()func()end_time = time.time()result = end_time - start_timeprint('程序执行时间为:%s秒'%result)return demo1def dec2(func): print("aaaa") def two(): print("bbbb") func() print("cccc") return two @dec2
@Demo
def time_operation():print("hello")time.sleep(1)print("python")if __name__ == '__main__':a = time_operationa()
控制台输出:
说明:
多个装饰器执行的顺序就是从最后一个装饰器开始,执行到第一个装饰器,再执行函数本身。这表明 Demo首先被应用,然后是 dec2
。
总结:
python装饰器在日志记录、性能分析、缓存结果、函数增强等方面应用广泛~