2012-08-09 49 views
0

略有Applying python decorators to methods in a class修改答案,也可以将装饰应用到一个类中的每个方法。没有检查模块,有没有办法做到这一点?我一直在尝试使用元类来完成这个工作,并修改__getattribute__,但我一直在获取无限递归。从How is the __getattribute__ method used?,这可以使用object .__ getattribute __(self,name)在普通类中修复。元类有什么相同之处吗?蟒蛇应用于装饰到每一个方法的类,而不检查

回答

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.UnboundMethodTypetypes.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

注意:它不会装饰静态方法和类方法

+0

。在你的示例中没有的元类。 – delnan 2012-08-09 21:27:56

+0

你确定它不会装饰静态方法吗?因为在提出这个问题之后,我发现了新方法,并且在静态方法工作的地方写了一些非常类似的东西。 – weeb 2012-08-09 21:43:28