我想构造用作装饰器的类,并保留以下原则:
这是针对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
什么都不做的装饰器类如下所示:
class NullDecl (object): def __init__ (self, func): self.func = func for name in set(dir(func)) - set(dir(self)): setattr(self, name, getattr(func, name)) def __call__ (self, *args): return self.func (*args)
然后您可以正常应用它:
@NullDecl def myFunc (x,y,z): return (x+y)/z