稍微修改将python装饰器应用于类中的方法的答案,可以将装饰器应用于类中的每个方法。没有检查模块有没有办法做到这一点?我一直在尝试使用元类和修改 __getattribute__ 来实现这一点,但我不断得到无限递归。从如何使用 __getattribute__ 方法?,这可以使用 object.__getattribute__(self, name) 在普通类中修复。元类有什么等价的吗?
问问题
1410 次
1 回答
3
定义一个元类,然后在类定义的末尾应用装饰器。
class Classname:
def foo(self): pass
for name, fn in inspect.getmembers(Classname):
if isinstance(fn, types.UnboundMethodType):
setattr(Classname, name, decorator(fn))
对于 Python 3,只需types.UnboundMethodType
将types.FunctionType.
但如果你真的不想使用检查,那么你可以这样做
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
func(*args, **kwargs)
print "after",func.func_name
return wrapper
class MyKlass(object):
__metaclass__ = DecoMeta
def func1(self):
pass
MyKlass().func1()
输出:
func1 之前 func1
之后
注意:不会修饰staticmethod和classmethod
于 2012-08-09T21:26:12.950 回答