类修饰器

类修饰器是一个普通的函数或者类,可以接受一个类作为参数,并返回一个新的类。类修饰器可以修改类的函数或者修改类的成员。

以下示例是使用类修饰器给类增加成员。

def addAttrs(*attrs):
	def rebuild(cls):
		class NewClass(cls):
			def __init__(self, *args, **kwargs):
				for attr in attrs:
					setattr(self, attr, None)
				self.__id = id
				super(NewClass, self).__init__(*args, **kwargs)
		return NewClass
	return rebuild


@addAttrs('uuid', 'created')
class DBModel(object):
	def __init__(self, *args, **kwargs):
		pass


m = DBModel()
print(m.created)

任何对类的修改,其原理都是动态创建被修改类的一个子类。修改类的函数也不例外。以下示例也是通过动态创建被修改的类的子类来修改类的函数。

def class_decor(*method_names):
	def class_rebuilder(cls):
		class NewClass(cls):
			def __getattribute__(self, attr_name):
				attr_val = super(NewClass, self).__getattribute__(attr_name)
				# 这里可以做一些其他的处理
				return attr_val
		return NewClass
	return class_rebuilder


@class_decor('first_method', 'second_method')
class DecoratedClass(object):
	def first_method(self, *args, **kwargs):
		pass
	
	def second_method(self, *args, **kwargs):
		pass

使用类修饰器来对类进行改变是具有一定局限性的,如果需要更强大的动态修改功能,可以使用下面的元类。