• python-type&object&metaclass


    abc -> AbstractBaseClass -> 抽象基类

    object和type和class和metaclass

    • object
      • python所有的类都继承至object,object是所有对象的抽象
      • class关键字定义的类型,默认都是继承于object的
    • type
      • 继承至object
      • type是对类型的抽象,用来创建一个类型,__new__创建一个空间放这个类型,__init__初始化这个空间
      • type可以创建python类型,type(name, bases, dict) -> a new type(先不纠结:先有type还是先有object(-_-)
    • class
      • class定义一个类型,当代码执行到class定义语句时,会创建一个类型
      • 默认:没有定义metaclass的情况下,创建类型可以理解为type(name=ClassName, bases=[object], dict=dict(xx=xx))
      • metaclass,class Demo(metaclass=MetaClass) -> 指定一个metaclass在创建类型的时候就会用指定的metaclass去创建这个类型
      • metaclass创建类型:指定了metaclass或定义了__metaclass__属性或父类有__metaclass__属性,那么会用这个metaclass去创建类型(metaclass必须是type的子类)
    • class Demo(A,metaclass=B)先定义继承类,然后定义metaclass,先定义metaclass会语法错误,创建和初始化类型之间,python会先读取类定义,然后根据类的定义及继承体系去创建并初始化类型,并且,在创建初始化类型的过程中是可以覆盖类定义/重载的方法的
    • 总的来说,在读取完类的定义和继承体系之后,如果这个类有__metaclass__属性,将通过__metaclass__指定的元类来创建类型,否则可以理解为type用类创建类型
    # 定义一个metaclass
    class MetaClass(type): # 定义一个metaclass必须继承于type
      pass
    
    # 使用一个metaclass
    class Demo(metaclass=MetaClass): # 调用MetaClass的__new__和__init__方法来创建一个类型对象
      pass
    
    # 创建一个Demo实例
    demo = Demo() # 调用object的__new__和__init__方法来创建一个对象
    
  • 相关阅读:
    MySQL根据出生日期计算年龄的五种方法比较
    用于测试API并生文档的开发人员工具
    【实例】使用Eolinker工具进行接口测试时传递集合参数的方法
    如何克服API测试中的挑战
    关于API网关(一)性能
    为什么需要监控API
    比Swagger2更好用的自动生成文档工具?对比流程说话!
    如何通过3个步骤执行基本的API测试
    【学习】API接口测试用例编写规则
    微信小程序之蓝牙 BLE 踩坑记录
  • 原文地址:https://www.cnblogs.com/bonus_scene/p/15187509.html
Copyright © 2020-2023  润新知