• 自定义创建元类


    #coding=utf-8
    
    class UpperAttrMetaClass(type):
        # __new__ 是在__init__之前被调用的特殊方法
        # __new__是用来创建对象并返回之的方法
        # 而__init__只是用来将传入的参数初始化给对象
        # __new__能够控制对象的创建
        # 这里,创建的对象是类,自定义这个类,我们这里改写__new__
        # 如果你希望的话,你也可以在__init__中做些事情
        # 可改写__call__特殊方法
        def __new__(cls, future_class_name, future_class_parents, future_class_attr):
            # cls、类名、父类、需要修改的字典
            #遍历属性字典,把不是__开头的属性名字变为大写
            newAttr = {}
            for key,value in future_class_attr.items():
                if not key.startswith("__"):
                    newAttr[key.upper()] = value
                    #使字典的键值大写
    
            # 方法1:通过'type'来做类对象的创建
            # return type(future_class_name, future_class_parents, newAttr)
            # type  类名、父类名、字典(刚刚进行修改的字典)
            # 方法2:复用type.__new__方法
            # 这就是基本的OOP编程,没什么魔法
            # return type.__new__(cls, future_class_name, future_class_parents, newAttr)
            # 类名、父类名、字典(刚刚进行修改的字典)
            # 方法3:使用super方法
            return super(UpperAttrMetaClass,cls).__new__(cls, future_class_name, future_class_parents, newAttr)
    
    
    
    # python3的用法
    class Foo(object, metaclass = UpperAttrMetaClass):
        # metaclass运行类的时候,根据metaclass的属性。修改类中的属性
        bar = 'bip'
    # hasattr 查看类中是否具有该属性
    print(hasattr(Foo, 'bar'))
    # 输出: False
    print(hasattr(Foo, 'BAR'))
    # 输出:True
    
    f = Foo()
    # 进行构造,产生 f 对象
    print(f.BAR)
    # 输出:'bip',metaclass修改了Foo类

    class UpperAttrMetaClass(type):
        # __new__ 是在__init__之前被调用的特殊方法
        # __new__是用来创建对象并返回之的方法
        # 而__init__只是用来将传入的参数初始化给对象
        # 你很少用到__new__,除非你希望能够控制对象的创建
        # 这里,创建的对象是类,我们希望能够自定义它,所以我们这里改写__new__
        # 如果你希望的话,你也可以在__init__中做些事情
        # 还有一些高级的用法会涉及到改写__call__特殊方法,但是我们这里不用
        def __new__(cls, future_class_name, future_class_parents, future_class_attr):
            #遍历属性字典,把不是__开头的属性名字变为大写
            newAttr = {}
            for name,value in future_class_attr.items():
                if not name.startswith("__"):
                    newAttr[name.upper()] = value
            # 方法1:通过'type'来做类对象的创建
            return type(future_class_name, future_class_parents, newAttr)
            # 方法2:复用type.__new__方法
            # return type.__new__(cls, future_class_name, future_class_parents, newAttr)
            #return type.__new__(cls,future_class_name,future_class_parents,newAttr)
            # 方法3:使用super方法
            return super(UpperAttrMetaClass, cls).__new__(cls, future_class_name, future_class_parents, newAttr)
    # python3的用法
    class Foo(object, metaclass = UpperAttrMetaClass):
       bar = 'bip'
    print(hasattr(Foo, 'bar'))
    
    print(hasattr(Foo, 'BAR'))
    f = Foo()
    print(f.BAR)

    2020-05-08

  • 相关阅读:
    NOIP知识点&&模板整理【更新中】
    qbxt DAY7 T4
    qbxt DAY7 T2
    qbxt DAY 6 T3 柯西不等式和拉格朗日不等式
    qbxt DAY4 T4
    qbxt DAY4 T3
    #98. 表达式计算 杂想
    扫描线入门学习笔记 (主要讲解代码实现)
    学OI要知道的基础知识(咕咕咕)
    主定理学习笔记(总结向)
  • 原文地址:https://www.cnblogs.com/hany-postq473111315/p/12846996.html
Copyright © 2020-2023  润新知