首页 > 代码库 > python 装饰器的缺点以及解决方法
python 装饰器的缺点以及解决方法
1.python装饰器的缺点
装饰器可以允许我们在不改变函数或犯方法的调用方式的情况下,添加额外的功能;
如下所示,我们要在中的方法之前增加装饰器check_is_admin,用来判断执行类的方法的用户是否为admin用户;
def check_is_admin(f): def wrapper(*args,**kwargs): if kwargs.get(‘username‘) != ‘admin‘: raise Exception("This user is not allowed to get food") return f(*args,**kwargs) return wrapper class store(object): @check_is_admin def get_food(self,username,food): return self.storage.get(food) @check_is_admin def put_food(self,username,food): self.storage.put(food)
但是,经过装饰器修饰的函数,其func_name和func_doc的属性都会丢失;
如下:
def foobar(username="someone"): """Do crzay staff.""" pass print foobar.func_doc print foobar.func_name 执行结果为: Do crzay staff. foobar
如果给上述函数增加装饰器呢?
def is_admin(f): def wrapper(*args,**kwargs): if kwargs.get(*args,**kwargs): raise Exception("This user is not allowed to get food") return f(*args,**kwargs) return wrapper @is_admin def foobar(username="someone"): """Do crazy staff""" pass print foobar.__doc__ print foobar.__name__ 执行结果为: None wrapper
2.解决方案
使用functools的update_wrapper函数可以解决该问题
如下:
def is_admin(f): def wrapper(*args,**kwargs): if kwargs.get(*args,**kwargs): raise Exception("This user is not allowed to get food") return f(*args,**kwargs) return wrapper def foobar(username="someone"): """Do crazy staff""" pass import functools foobar = functools.update_wrapper(is_admin,foobar) print foobar.__name__ print foobar.__doc__ 执行结果如下: foobar Do crazy staff
python 装饰器的缺点以及解决方法
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。