python元编程(metaclass)

  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

原文地址:https://www.cnblogs.com/chusiyong/p/11561916.html