理解Python中的类装饰

时间:2015-03-18 17:42:42

标签: python decorator

我目前正在为我的示例类在Python中使用类装饰器。下面是包含原始类,类装饰器和包含函数装饰器的类的代码。此代码根据需要编译和工作。为简洁起见,我省略了示例类中的一些函数。

def class_decorator(*method_names):
    def class_rebuilder(cls):    
        class NewClass(cls):        
            def __getattribute__(self, attr_name):            
                obj = super(NewClass, self).__getattribute__(attr_name)
                if (hasattr(obj, '__call__') and (attr_name in method_names)):                
                    if (attr_name == 'function1'):                    
                        return example_ClassDecorator().function1_decorator(obj)      
                    ...                              
                return obj
        return NewClass
    return class_rebuilder

class example_ClassDecorator():
    @classmethod
    def function1_decorator(cls, example_function1):    
        def decorator(*args ,**kwargs):        
            print ('Inside the decorator for function1 with args: ', args)
            return example_function1(*args , **kwargs)
        return decorator  
    ...

@class_decorator('function1',...)
class example(object):
    def __init__(self):    
        pass
    def function1(self, arg1):    
        print ('I am in example function1 with arg: ', arg1)
        if (arg1 == 'test'):        
            print 'testing'
    ...

我通过研究来了解如何装饰方法和类以及python。如前所述,此代码有效。我的问题是,我不完全理解正在发生的事情的逻辑。

以下是我目前对代码的理解:

  1. 我知道@class_decorator('function1','function2',...)标签 上面的示例类告诉python给定的函数 这堂课要装饰。这些字符串是 *method_names已传入class_decorator函数。
  2. class_decorator然后调用其class_rebuilder(cls)函数     返回将包含新的类NewClass(cls)     装饰函数

  3. NewClass然后调用__getattribute__(self, attr_name)obj是     用于保存传入的(函数)对象。

  4. if (hasattr(obj, '__call__') and (attr_name in method_names)):     确认obj是一个函数(通过确保它具有     与所有函数对象关联的__call__属性)和那个     它是要装饰的功能之一。

  5. 一系列if语句决定了哪个函数装饰器     从example_ClassDecorator函数调用。

  6. class_decorator定义是我的大部分问题所在。

    • 如何调用class_rebuilder函数? python自己调用它吗?
    • attr_name中填充__getattribute__参数的内容 方法
    • 这一行: obj = super(NewClass,self).__getattribute__(attr_name) 它似乎是保存命名的属性对象,以便检查它是一个函数。但我不明白超级电话会发生什么。

    任何帮助解释这段代码或者更喜欢在python中装饰类的方法都将非常感激。

0 个答案:

没有答案