我目前正在为我的示例类在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。如前所述,此代码有效。我的问题是,我不完全理解正在发生的事情的逻辑。
以下是我目前对代码的理解:
@class_decorator('function1','function2',...)
标签
上面的示例类告诉python给定的函数
这堂课要装饰。这些字符串是
*method_names
已传入class_decorator
函数。 class_decorator
然后调用其class_rebuilder(cls)
函数
返回将包含新的类NewClass(cls)
装饰函数
NewClass
然后调用__getattribute__(self, attr_name)
。 obj
是
用于保存传入的(函数)对象。
if (hasattr(obj, '__call__') and (attr_name in method_names)):
确认obj
是一个函数(通过确保它具有
与所有函数对象关联的__call__
属性)和那个
它是要装饰的功能之一。
一系列if语句决定了哪个函数装饰器
从example_ClassDecorator
函数调用。
class_decorator
定义是我的大部分问题所在。
class_rebuilder
函数? python自己调用它吗?attr_name
中填充__getattribute__
参数的内容
方法obj = super(NewClass,self).__getattribute__(attr_name)
它似乎是保存命名的属性对象,以便检查它是一个函数。但我不明白超级电话会发生什么。任何帮助解释这段代码或者更喜欢在python中装饰类的方法都将非常感激。