Python元编程就是使用metaclass技术进行编程,99%的情况下不会使用,了解即可。
Python中的类和对象
对于学习Python和使用Python的同学,你是否好奇过Python中的对象究竟是怎么被创建处理的?你是否知道Python的class也是对象?是的,你没看错,class也是object。既然class也是objet,那么class这个object是谁创建处理的?不纠结,直接给出答案,是有type()创建的。可以很概括的说:Python中类和对象的起源就是type()方法。
让我们来捋一下流程:type创建class,class创建object;class即是class也是obejct,是的,就是这样。
什么是metaclass?
metaclass就是type自己或是其子类。不同的类可以指定不同的metaclass,从而实现动态修改类的目的。(动态的修改类不一定要用metaclass,装饰器同样可以解决)
例子
要求:使用方法的形式,将一个类的自定义属性变成首字符大写,其余小写。
def upper_attr(class_name, class_parents, class_attr): uppercase_attr = {} for attr_name, attr_value in class_attr.items(): if attr_name.startswith('__'): uppercase_attr[attr_name] = attr_value else: uppercase_attr[attr_name.capitalize()] = attr_value return type(class_name, class_parents, uppercase_attr) class Test(metaclass = upper_attr): data = 'abc' print(hasattr(Test(), 'data')) print(hasattr(Test(), 'Data')) print(Test.Data)
要求:使用类的形式,将一个类的自定义属性变成首字符大写,其余小写。
class UpperAttrMetaclass(type): def __new__(cls, cls_name, bases, attr_dict): uppercase_attr = {} for name, val in attr_dict.items(): if name.startswith('__'): uppercase_attr[name] = val else: uppercase_attr[name.capitalize()] = val return super().__new__(cls, cls_name, bases, uppercase_attr) class Test(metaclass = UpperAttrMetaclass): data = 'abc' print(hasattr(Test(), 'data')) print(hasattr(Test(), 'Data')) print(Test.Data)
参考博客:https://www.jianshu.com/p/224ffcb8e73e