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
原文地址:http://www.cnblogs.com/cqq-20151202/p/6606544.html