类修饰器
类修饰器是一个普通的函数或者类,可以接受一个类作为参数,并返回一个新的类。类修饰器可以修改类的函数或者修改类的成员。
以下示例是使用类修饰器给类增加成员。
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
使用类修饰器来对类进行改变是具有一定局限性的,如果需要更强大的动态修改功能,可以使用下面的元类。