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

将装饰器附加到类中的所有函数上

曾喜
2023-03-14
问题内容

我并不是真的需要这样做,但我只是想知道,是否有一种方法可以将装饰器一般地绑定到类中的所有函数,而不是为每个函数显式说明。

我想它然后成为一种方面,而不是装饰者,它的确有些奇怪,但是在考虑诸如计时或验证之类的事情时,它会很整洁。


问题答案:

进行此操作或对类定义进行其他修改的最简单方法是定义一个元类。

另外,只需在类定义的末尾应用装饰器即可:

class Something:
   def foo(self): pass

for name, fn in inspect.getmembers(Something):
    if isinstance(fn, types.UnboundMethodType):
        setattr(Something, name, decorator(fn))

对于Python 3,请替换types.UnboundMethodTypetypes.FunctionType

当然,在实践中,您将需要更选择性地应用装饰器。只要您要装饰除一种方法外的所有方法,您就会发现仅以传统方式使用装饰器语法会更轻松,更灵活。



 类似资料:
  • 问题内容: 我想这就是它们的称呼,但我会举一些例子以防万一。 装饰类: 装饰器功能: 使用一个或另一个只是口味的问题吗?有实际区别吗? 问题答案: 如果您可以编写函数来实现装饰器,则应首选它。但是并非所有装饰器都可以轻松地编写为一个函数-例如,当您要存储一些内部状态时。 我见过人们(包括我自己)经过荒唐的努力,只用函数编写装饰器。我仍然不知道为什么,一个班级的开销通常可以忽略不计。

  • 问题内容: 我已经看到许多Python装饰器的示例,它们是: 函数样式修饰符(包装函数) 类风格装饰(实施,和) 不带参数的装饰器 带参数的装饰器 “方法友好”的装饰器(即可以装饰类中的方法) “功能友好”的装饰器(可以装饰普通功能 可以装饰方法和功能的装饰器 但是我从未见过一个可以完成上述所有操作的示例,而且我无法从各种答案到特定问题,这个或这个上看到过,如何结合以上所有内容。 我想要的是一个

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

  • 尝试Recycerview-StickyHeaders库:http://eowise.github.io/Recycerview-StickyHeaders/ 在使用这个库时,发现它监听基于OnItemTouchListener的整个header。有没有一种方法可以收听个人视图上的点击? 除此之外,我尝试直接在BigramHeaderAdapter(库示例中的头适配器)中添加OnClickList

  • 问题 你想在装饰器中给被包装函数增加额外的参数,但是不能影响这个函数现有的调用规则。 解决方案 可以使用关键字参数来给被包装函数增加额外参数。考虑下面的装饰器: from functools import wraps def optional_debug(func): @wraps(func) def wrapper(*args, debug=False, **kwargs):

  • 问题内容: 我想构造用作装饰器的类,并保留以下原则: 应该有可能在top 1函数上堆叠多个此类装饰器。 产生的函数名称指针应该与没有装饰器的相同函数没有区别,可能只是它是哪种类型/类。 除非装饰员实际要求,否则订购装饰员应该无关紧要。就是 独立的装饰器可以以任何顺序应用。 这是针对Django项目的,现在我正在处理的特定情况下,该方法需要2个装饰器,并显示为普通的python函数: @AutoTe

  • 问题内容: 举个例子: 我遇到的问题是,甚至在我调用要装饰的函数之前就调用了。 开始输出: 在这一点上,我什至没有调用过一个装饰过的函数。 我刚刚开始使用装饰器,所以也许我缺少了一些东西。 问题答案: 我相信python装饰器只是语法糖。 和…一样 如您所见,即使没有调用 bar 也将调用 foo 。这就是为什么您看到装饰器函数的输出的原因。对于您将装饰器应用到的每个函数,您的输出应只包含一行。

  • 附录:关于装饰器 认识装饰器 在python中,对于一个函数,若想在其运行前后做点什么,那么装饰器是再好不过的选择,这种语法在一些项目中十分常见,是Python语言的黑魔法,用处颇多,话不多说,让我们看一下代码: #!/usr/bin/env # -*-coding:utf-8-*- # script: 01.py __author__ = 'howie' from functools impo