介绍在python程序中,装饰器可以用来将相同的功能插入到不同的函数或类中。与其他高级语言相比,python不仅简化了装饰器代码,而且可以快速实现需要的功能。同时,装饰器在向函数或类添加功能时变得非常透明。创建装饰器首先,装饰器简单来说就是一个函数(方法),但是装饰器函数的参数必须是一个函数或者类。然后在装饰器函数中重新定义一个新的函数或类,并在某些函数执行前后使用被装饰的函数或类,最后返回新定义的函数或类。推荐观看:推荐几个学习Python的免费网站使用装饰器装饰函数(一)手动装饰器defdecorate1(fun):defwrapper():print("第一层装饰:原函数执行前的打印语句")fun()print("第一层装饰:原函数执行后的print语句")returnwrapperdeforiginal_fun():print("原函数内容")original_fun()#打印原函数内容original_fun=decorate1(original_fun)#这里当原函数名指向内嵌函数wrapper时,原函数original_fun()将不再执行#打印相同原函数名显示增强版函数输出:第一层原函数内容修饰层:原函数执行前打印第一层修饰原函数语句内容:打印语句原函数执行后(2)语法糖装饰器可以通过使用特殊符号“@”来实现,符号“@”以“@装饰器名称”的形式放在函数中或类定义之前linedefdecorate1(fun):defwrapper():print("第一层装饰:原函数执行前的打印语句")fun()print("第一层装饰:原函数执行后的打印语句执行原函数打印语句")returnwrapper@decorate1deforiginal_fun():print("原函数内容")original_fun()输出:第一层装饰:原函数执行前的打印语句,内容原函数第一层装饰:执行后的原函数print语句使用装饰器装饰类类似于装饰器装饰函数,唯一不同的是装饰器的内嵌函数变成了内嵌类ss(1)手动装饰器defdecorate1(fun):classwrapper():def__init__(self):self.wrapper=original_class()#保留一个original_class类对象defprintf(self):print("执行前打印语句原始类的")self.wrapper.printf()#原始类之一original_class对象,调用original_class类的实例方法printf()print("原类执行后的打印语句")returnwrapperclassoriginal_class:def__init__(self):self.text="iamoriginal_class"defprintf(self):print(self.text)o_class=decorate1(original_class)#相当于o_class指向wrappero_class().printf()#实例化一个包装类对象,执行包装类中的printf()方法输出:打印语句原类执行前i是original_class原类执行后的打印语句(2)语法糖装饰器defdecorate1(fun):classwrapper():def__init__(self):self.wrapper=fun()#保留一个original_class类对象defprintf(self):print("执行原类前的打印语句")self.wrapper.printf()#原类original_class的一个对象,调用其实例方法printf()theoriginal_classclassprint("执行后打印语句在原始类中”)=original_class()ori.printf()输出:原类执行前的打印语句iamoriginal_class;原类执行后的打印语句实现累积装饰器(一)手册Decoratordefdecorate1(fun):defwrapper():print("第一层装饰:原函数执行前的打印语句")fun()print("第一层装饰:原函数执行后的打印语句执行原函数")returnwrapperdefdecorate2(fun):defwrapper():print("第二层装饰:原函数执行前的打印语句")fun()print("第二层装饰decoration:原函数执行后的print语句")returnwrapperdeforiginal_fun():print("原函数内容")original_fun=decorate2(decorate1(original_fun))#original_fun不再指向原内存地址,而是指向到decorate2函数original_fun()的内置函数wrapper()的地址输出:第二层装饰:原函数执行前的打印语句第一层装饰:执行前的打印语句起源nal函数原函数内容第一层装饰:原函数执行后的打印语句第二层装饰:原函数执行后的打印语句(2)句法糖装饰器defdecorate1(fun):defwrapper():print("第一层装饰:原函数执行前的print语句")fun()print("第一层装饰:函数执行后的原print语句")returnwrapperdefdecorate2(fun):defwrapper():print("第二层装饰:原函数执行前的打印语句")fun()print("第二层装饰:原函数执行后的打印语句execution")returnwrapper@decorate2@decorate1deforiginal_fun():print("原函数内容")original_fun()输出:第二次装饰:打印原函数执行前的语句第一次装饰:原函数执行n前面的打印语句,原函数的内容,第一层装饰:原函数执行后的打印语句,第二层装饰:原函数执行后的打印语句
