• 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

  • 相关阅读:
    【LeetCode】Hash
    【LeetCode】Heap
    【LeetCode】Stack
    【CodeVS】 纯OI题
    【LeetCode】String
    【LeetCode】Array
    WinForm窗体 常用属性
    C# ADO.NET 实体类中的属性扩展
    C# ADO.NET 三层架构
    C# ADO.NET 数据库的安全(sql 字符串注入攻击、使用占位符防止注入攻击)
  • 原文地址:https://www.cnblogs.com/chusiyong/p/11561916.html
Copyright © 2020-2023  润新知