zoukankan      html  css  js  c++  java
  • 元类

    一,新式类与旧式类

    • 旧式类
      • 对于旧式类,类(class)和(type)并不完全相同。一个旧式类的实例总是继承自一个名为instance的内置类型。如果obj是旧式类的实例,那么obj.class就表示该类,但type(obj)始终是instance类型
    • 新式类
      • 新式类统一了类(class)和类型(type)的概念。如果obj是新式类实例,type(obj)则与obj.class相同
    • 注意点
      • 在python2

    二,类型(type)和类(class)

    在python中一切皆对象。类也是对象,所以一个类(class)必须有一个类型(type)

    • 实例的类型是类
    • 类的类型是type
    class Test:
        pass
    
    t = Test()
    print(type(t))        # <class '__main__.Test'> 
    print(type(Test))    # <class 'type'>
    • type的类型是type
    • 注意区分元类和继承的基类
      • 元类type:python03中所有的类都是通过type来创建出来的
      • object:顶层的基类,python03中所有类的顶层父类都是object

    三,使用type动态定义类

    内置type()函数在传递了一个参数时将返回类对象(class)。对于新式类,通常与对象的class属性相同。

    class type(object):
        """
        type(object_or_name, bases, dict)
        type(object) -> the object's type
        type(name, bases, dict) -> a new type
    • name:指定类名称,将成为该类的name属性  ->str类型
    • bases:指定继承类的基类元组,将成为该类的bases属性  ->tuple类型
    • dict:方法和属性,指定包含主体的名称空间字典,将成为该类的dict属性 ->dict类型键值对的形式表示属性或者对应的方法
    def func(self):
        print('打印func方法')
    
    Test = type('Test11', (object,), {"attr":100, "__attr2":200, 'function1':func})
    t = Test()
    t.function1()

    四,自定义元类

    • 必须继承type
      • 否则无法拥有创建类的能力(python中拥有创建类的能力就是type)
    • 重写new方法
      • 通过类来创建对象,触发的是new方法,自己定义的元类因此要重写new方法
    • type创建类的时候需要3个参数
      • 3个参数从方法的形参中接收,然后传给type的new方法中
    class MyMetaClass(type):
        """
        最基础的自定义元类
        """
        def __new__(cls, name, bases, attr_dict, *args, **kwargs):

    return super().__new__(cls, name, bases, attr_dict,) # return type.__new__(name, bases, attr_dict)  # 报错了
    # 通过自定义的元类创建类 class Test(metaclass=MyMetaClass): pass print(type(Test))    # <class '__main__.MyMetaClass'>

    五,ORM模型实现思路

    https://blog.csdn.net/a2011480169/article/details/87891753

    type的两个功能

    • 查找对象类型
    • 创造一个新的类型
    class type(object):
        """
        type(object_or_name, bases, dict)
        type(object) -> the object's type
        type(name, bases, dict) -> a new type
  • 相关阅读:
    EF基于方法的查询语法
    &,^,|,的简化计算与理解
    会计中阿拉伯数字变数字繁体大写
    接口对接请求方法
    经验总结之Android framework开发
    android开机过程简单描述
    为什么一个类的全局变量默认以m开头?
    使用DataOutputStream写入int类型数字不能显示
    20151128学习总结
    sky简介
  • 原文地址:https://www.cnblogs.com/ella-li/p/14225764.html
Copyright © 2011-2022 走看看