小编典典

Python中的装饰器类

python

我想构造用作装饰器的类,并保留以下原则:

  1. 应该有可能在top 1函数上堆叠多个此类装饰器。
  2. 产生的函数名称指针应该与没有装饰器的相同函数没有区别,可能只是它是哪种类型/类。
  3. 除非装饰员实际要求,否则订购装饰员应该无关紧要。就是 独立的装饰器可以以任何顺序应用。

这是针对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

阅读 251

收藏
2021-01-20

共1个答案

小编典典

什么都不做的装饰器类如下所示:

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
2021-01-20