Python中的装饰器类
我想构造用作装饰器的类,并保留以下原则:
- 应该有可能在top 1函数上堆叠多个此类装饰器。
- 产生的函数名称指针应该与没有装饰器的相同函数没有区别,可能只是它是哪种类型/类。
- 除非装饰员实际要求,否则订购装饰员应该无关紧要。就是 独立的装饰器可以以任何顺序应用。
这是针对Django项目的,现在我正在处理的特定情况下,该方法需要2个装饰器,并显示为普通的python函数:
@AccessCheck
@AutoTemplate
def view(request, item_id) {}
@AutoTemplate更改了该函数,以使其不返回HttpResponse,而仅返回一个在上下文中使用的字典。使用RequestContext,并从方法名称和模块推断模板名称。
@AccessCheck基于item_id向用户添加其他检查。
我猜这只是使构造函数正确并复制适当的属性,但是这些是哪些属性?
以下装饰器将无法正常运行:
class NullDecl (object):
def __init__ (self, func):
self.func = func
def __call__ (self, * args):
return self.func (*args)
如以下代码所示:
@NullDecl
@NullDecl
def decorated():
pass
def pure():
pass
# results in set(['func_closure', 'func_dict', '__get__', 'func_name',
# 'func_defaults', '__name__', 'func_code', 'func_doc', 'func_globals'])
print set(dir(pure)) - set(dir(decorated));
此外,尝试添加“打印FUNC。 名称 在NullDecl构造函数,它会为第一个装饰工作,而不是第二个” -正如名字将会丢失。
改进了 eduffy 的答案,它似乎工作得很好:
class NullDecl (object):
def __init__ (self, func):
self.func = func
for n in set(dir(func)) - set(dir(self)):
setattr(self, n, getattr(func, n))
def __call__ (self, * args):
return self.func (*args)
def __repr__(self):
return self.func