zoukankan      html  css  js  c++  java
  • Python元类

    本节介绍一下Python中元类的基本内容

    type :python3中所有的类都是通过type创建出来的

    object :所有类的顶级父类

    想说的话在注释中都添加了,想学习的可以看一下

    # 元类 python中内置的元类: type
    # 元组如果只有一个参数需要在参数后面增加一个逗号,不然是错误的。空元组()
    # type创建类需要三个参数,第一个类名字符串类型 第二个要继承的类是一个元组,
    # 第三个是属性及方法是一个字典 键值对的形式表示属性或者对应的方法
    T = type('小明', (object,), {'attr': 100, '__attr2': 200})  # 会返回一个类
    #          类名     要继承的类       类的属性和方法
    print(T)
    
    
    class T1(object):
        attr = 100
        __attr2 = 200
    
    
    print(T1)
    # 定义的类是相同的
    
    print(T.__dict__)  # 查看类所拥有的属性
    
    
    def func(self):
        print('-----------这个是self')
    
    
    T3 = type('小明2', (object,), {'function': func})  # 传入方法创建类
    print(T3)
    T3().function()
    
    
    # 自定义元类 必须继承type
    # type 创建类需要三个参数
    class MyClass(type):
        # 重写new 方法
        def __new__(cls, name, bases, attr_dict, *args, **kwargs):
            print('最基础的自定义元类')
            # return type.__new__(name, bases, attr_dict)
            return super().__new__(cls, name, bases, attr_dict)
    
    
    # metaclass 用来指定元类 如果不传默认是type 使用自定义的元类创建的类
    class One(metaclass=MyClass):
        name = '小明'
    
    
    print(type(One))
    print(One.name)
    
    
    # 从继承的父类里面找有没有指定元类,如果找到了子类就用父类指定的元类来创建类
    class Two(One):
        pass
    
    
    print(type(Two))
    
    
    # 定义一个类,通过元类来让该类的类属性变成大写
    class MyClassTow(type):
        def __new__(cls, name, bases, attr_dict, *args, **kwargs):
            # 遍历属性名称,遍历字典的键值对用items
            for k, v in attr_dict.items():
                attr_dict.pop(k)
                # 删除key
                attr_dict[k.upper()] = v
                # 将key转为大写
            # attr_dict['__slots__'] = ['name', 'age', 'gender']
            # 限制通过这个元类创建的类的实例对象的属性
            return super().__new__(cls, name, bases, attr_dict)
    
    
    class Three(metaclass=MyClassTow):
        name = '小明'
        age = 18
        gender = ''
    
    
    print(Three.__dict__)
  • 相关阅读:
    LLDB 常用的调试命令
    iOS https认证
    pod lib lint xxx.podspec 验证出错 Could not find a `ios` simulator
    LLDB 调试
    First throw call stack: 不打印方法名
    AOP
    增强现实
    2017
    iOS的主要框架介绍 (转载)
    iOS中都有什么设计模式?各个设计模式的作用 (转载)
  • 原文地址:https://www.cnblogs.com/congyiwei/p/12571347.html
Copyright © 2011-2022 走看看