python装饰器保留被装饰函数的元属性
python中一切都是对象,方法也是对象,也可以作为参数传递,同样也可以作为返回值。一个以方法为入参并返回一个新的方法的方法就是装饰器。一个方法被装饰器包装后,如果不做额外的处理该方法的元属性就会丢失,我们先看个例子。
未装饰前的原属性defyourname(name):"""打印你的名字"""print(name)#调用方法yourname("陆小凤")#方法的名称print(yourname.__name__)#方法的帮助文档print(yourname.__doc__)#dir可以查看所有对象的属性和方法dir(yourname)装饰后的元属性
defsayHi(func):definner(*args,**kwargs):"""inner方法的帮助文档"""print("Hi",end="")func(*args,**kwargs)returninner
sayHidefyourname(name):"""打印你的名字"""print(name)#调用方法yourname("陆小凤")#方法的名称print(yourname.__name__)#方法的帮助文档print(yourname.__doc__)根据下面的结果我们看出被sayHi装饰器装饰后的方法yourname的元属性被改变了,变成了inner方法的元属性了,这是因为被sayHi装饰后yourname方法实际上已经被改变了,已经成了inner方法了。但是这样的结果并不是我们想要的,我们希望能够保持被装饰的方法的元属性不改变。
保留被装饰函数的元属性明白了元属性被改变的原因,也就基本上清楚了保留被装饰函数元属性的办法了,其实就是把装饰返回的方法的元属性重新恢复成装饰前的方法的元属性,但是这是件繁琐的工作。python提供了另外一个装饰器
wraps来实现保留方法的元属性。上面的示例使用wraps保护后的结果如下。fromfunctoolsimportwrapsdefsayHi(func):
wraps(func)#wraps方法实现保留func方法的元属性definner(*args,**kwargs):"""inner方法的帮助文档"""print("Hi",end="")func(*args,**kwargs)returninnersayHidefyourname(name):"""打印你的名字"""print(name)#调用方法yourname("陆小凤")#方法的名称print(yourname.__name__)#方法的帮助文档print(yourname.__doc__)预览时标签不可点收录于话题#个上一篇下一篇转载请注明:http://www.sonphie.com/jbzd/14377.html