我真的不需要这样做,但只是想知道,有没有一种方法可以将装饰器一般地绑定到类中的所有函数,而不是为每个函数显式声明它。
我想它会变成一种方面,而不是装饰器,它确实感觉有点奇怪,但考虑到时间或授权之类的东西,它会非常整洁。
原文由 dochead 发布,翻译遵循 CC BY-SA 4.0 许可协议
我真的不需要这样做,但只是想知道,有没有一种方法可以将装饰器一般地绑定到类中的所有函数,而不是为每个函数显式声明它。
我想它会变成一种方面,而不是装饰器,它确实感觉有点奇怪,但考虑到时间或授权之类的东西,它会非常整洁。
原文由 dochead 发布,翻译遵循 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 许可协议
2 回答5.2k 阅读✓ 已解决
2 回答1.1k 阅读✓ 已解决
4 回答1.4k 阅读✓ 已解决
3 回答1.3k 阅读✓ 已解决
3 回答1.3k 阅读✓ 已解决
2 回答893 阅读✓ 已解决
1 回答1.8k 阅读✓ 已解决
执行此操作或对类定义进行其他修改的最干净的方法是定义元类。
或者,只需使用
inspect
在类定义的末尾应用装饰器:在实践中,当然你会想要更有选择性地应用你的装饰器。只要您想要装饰除一种方法之外的所有方法,您就会发现以传统方式使用装饰器语法更容易、更灵活。