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

新手上路,请多包涵

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

我想它会变成一种方面,而不是装饰器,它确实感觉有点奇怪,但考虑到时间或授权之类的东西,它会非常整洁。

原文由 dochead 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 355
2 个回答

执行此操作或对类定义进行其他修改的最干净的方法是定义元类。

或者,只需使用 inspect 在类定义的末尾应用装饰器:

 import inspect

class Something:
    def foo(self):
        pass

for name, fn in inspect.getmembers(Something, inspect.isfunction):
    setattr(Something, name, decorator(fn))

在实践中,当然你会想要更有选择性地应用你的装饰器。只要您想要装饰除一种方法之外的所有方法,您就会发现以传统方式使用装饰器语法更容易、更灵活。

原文由 Duncan 发布,翻译遵循 CC BY-SA 4.0 许可协议

每次你想改变类定义时,你可以使用类装饰器或元类。例如使用元类

import types

class DecoMeta(type):
   def __new__(cls, name, bases, attrs):

      for attr_name, attr_value in attrs.iteritems():
         if isinstance(attr_value, types.FunctionType):
            attrs[attr_name] = cls.deco(attr_value)

      return super(DecoMeta, cls).__new__(cls, name, bases, attrs)

   @classmethod
   def deco(cls, func):
      def wrapper(*args, **kwargs):
         print "before",func.func_name
         result = func(*args, **kwargs)
         print "after",func.func_name
         return result
      return wrapper

class MyKlass(object):
   __metaclass__ = DecoMeta

   def func1(self):
      pass

MyKlass().func1()

输出:

 before func1
after func1

注意:不会修饰staticmethod和classmethod

原文由 Anurag Uniyal 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题