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程序设计有所帮助。