当前位置: 首页 > 面试题库 >

Python中的装饰器类

薄涵衍
2023-03-14
问题内容

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

  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

问题答案:

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

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


 类似资料:
  • 问题内容: 我正在尝试学习装饰器。我了解它的概念,现在尝试实现它。 这是我编写 的代码,代码不言自明。它只是检查参数是否传入。 抛出错误的说法。我了解它未在下定义,但不知道如何纠正此代码?我要去哪里错了? 问题答案: 您的装饰器应如下所示: 需要注意的几点: 期望将类作为第一个参数(您可以将其替换为简单的try / except TypeError除外)。 包装器应返回一个函数,而不是被调用函数的

  • 本文向大家介绍python中的装饰器详解,包括了python中的装饰器详解的使用技巧和注意事项,需要的朋友参考一下 在了解装饰器的之前一定要先了解函数作为参数传递, 什么是函数内嵌,请参考我之前写的博客函数简介 因为在python里面,函数也是对象,也可以作为参数进行传递.python装饰器本质也是一种特殊函数,它接收的参数是函数对象,然后动态地函数参数添加额外的功能,而不用修改原有的函数对象.p

  • 问题内容: 我正在尝试用python写一个弯曲的装饰器,我想我已经有了大致的想法,但是仍然有一些情况无法正常工作… 虽然在以下情况下可以正常工作: 对于以下情况,它将失败: 任何有关如何正确做到这一点的指针将不胜感激! 谢谢! 问题答案: 下面的实现是幼稚的,谷歌为“ currying python”提供了更准确的例子。

  • 本文向大家介绍基于Python 装饰器装饰类中的方法实例,包括了基于Python 装饰器装饰类中的方法实例的使用技巧和注意事项,需要的朋友参考一下 title: Python 装饰器装饰类中的方法 comments: true date: 2017-04-17 20:44:31 tags: ['Python', 'Decorate'] category: ['Python'] --- 目前在中文网

  • 主要内容:带参数的函数装饰器,函数装饰器可以嵌套前面章节中,我们已经讲解了 Python 内置的 3 种函数装饰器,分别是 @staticmethod、@classmethod 和 @property,其中 staticmethod()、classmethod() 和 property() 都是 Python 的内置函数。 那么,函数装饰器的工作原理是怎样的呢?假设用 funA() 函数装饰器去装饰 funB() 函数,如下所示: 实际上,上面

  • 问题内容: 有没有办法像python风格那样装饰C ++中的函数或方法? 例如,使用宏: 要么 可能吗? 问题答案: 提供了我提出的解决方案的大多数构建块。 这是我建议的解决方案。 输出: ps 提供了一个可以进行功能调用以外的其他功能的地方。如果您想简单地传递至,可以使用: