Python 装饰器@,对函数进行功能扩展操作示例【开闭原则】
本文实例讲述了Python装饰器@,对函数进行功能扩展操作。分享给大家供大家参考,具体如下:
装饰器可以对原函数进行功能扩展,但还不需要修改原函数的内容(开闭原则),也不需要修改原函数的调用。
demo.py(装饰器,@):
#闭包 defw1(func): definner(): #对原函数进行功能扩展 print("功能扩展") func() #returnfunc()#如果原函数需要返回值,可以return returninner#闭包 @w1 #相当于f1=w1(f1) deff1(): print('f1')#原函数不需要修改 f1()#原函数的调用也不需要修改
demo.py(装饰器通用格式,对不定长参数并且有返回值的函数进行装饰):
defset_func(func): defcall_func(*args,**kwargs): print("装饰器扩展的功能") returnfunc(*args,**kwargs)#这里的*和*表示拆包。不管有没有返回值,return都没问题。 returncall_func @set_func#相当于test1=set_func(test1) #对含有不定长参数并且有返回值的函数进行装饰。 deftest1(num,*args,**kwargs): print("-----test1----%d"%num) return"ok" ret=test1(100) print(ret)
demo.py(多个装饰器的装饰顺序):
defadd_1(func): defcall_func(*args,**kwargs): print("装饰器1扩展的功能") returnfunc(*args,**kwargs) returncall_func defadd_2(func): defcall_func(*args,**kwargs): print("装饰器2扩展的功能") returnfunc(*args,**kwargs) returncall_func @add_2 @add_1 #先装饰add_1,再装饰add_2 deftest1(): print("------test1------") test1()#在调用函数之前就已经装饰好了。 #装饰器2扩展的功能 #装饰器1扩展的功能 #------test1------
demo.py(用类充当装饰器):
#用类充当装饰器 classTest(object): def__init__(self,func): self.func=func def__call__(self,*args,**kwargs): print("这里是装饰器添加的功能.....") returnself.func(*args,**kwargs) @Test#相当于get_str=Test(get_str)#实例化对象,调用__init__方法。 defget_str(): return"haha" print(get_str())#实例对象(),会自动调用对象的__call__方法。
@functools.wraps修饰装饰器的内层函数。(修饰内层函数后,被装饰器装饰的函数的__name__、__doc__不会被装饰器改变)
demo.py(@functools.wraps修饰装饰器的内层函数):
#coding:utf-8 importfunctools#导入 #自定义的装饰器 deflogin_required(func): @functools.wraps(func) #装饰器的内层函数,一般要加@functools.wraps装饰器 defwrapper(*arg,**kwargs): """wrapper的说明文档""" #。。。 returnfunc(*arg,**kwargs) returnwrapper #使用自定义的装饰器 @login_required defdemofunc(): """demofunc的说明文档""" pass print(demofunc.__name__)#不加@functools.wraps装饰器时:"wrapper"。加装饰器时:"demofunc" print(demofunc.__doc__)#不加@functools.wraps装饰器时:"wrapper的说明文档"。加装饰器时:"demofunc的说明文档"
更多关于Python相关内容感兴趣的读者可查看本站专题:《Python面向对象程序设计入门与进阶教程》、《Python数据结构与算法教程》、《Python函数使用技巧总结》、《Python字符串操作技巧汇总》、《Python编码操作技巧总结》及《Python入门与进阶经典教程》
希望本文所述对大家Python程序设计有所帮助。