zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    常用数据结构之哈希表
    常用数据结构之队列
    常用的数据结构之栈
    常用的数据结构之链表
    Zabbix3.4监控Windows机器CPU使用率
    在Pycharm中导入第三方模块库(诸如:matplotlib、numpy等)
    WARNING: You are using pip version 20.2.4; however, version 20.3.1 is available.
    npm无法安装node-sass的解决方法
    常见的树形结构封装
    Mac安装MySql
  • 原文地址:https://www.cnblogs.com/chusiyong/p/11561916.html
Copyright © 2011-2022 走看看