• 三、什么是元类

    三、什么是元类

    通过上面的介绍,终于模模糊糊的带到元类这里来了。可是我们到现在还不知道元类是什么东东。

    我们创建类的时候,大多数是为了创建类的实例对象。那么元类呢?元类就是用来创建类的。也可以换个理解方式就是:元类就是类的类。

    通过上面 type() 函数的介绍,我们知道可以通过 type() 函数创建类:

    1. MyClass = type('MyClass', (), {})

    实际上 type() 函数是一个元类。type() 就是 Python 在背后用来创建所有类的元类。

    那么现在我们也可以猜到一下为什么 type() 函数是 type 而不是 Type呢?

    这可能是为了和 str 保持一致性,str 是用来创建字符串对象的类,而 int 是用来创建整数对象的类。type 就是创建类对象的类。你可以通过检查 __class__ 属性来看到这一点。Python 中所有的东西,注意喔,这里是说所有的东西,他们都是对象。这包括整数、字符串、函数以及类。它们全部都是对象,而且它们都是从一个类创建而来。

    1. # 整形
    2. age = 23
    3. print(age.__class__)
    4. # 字符串
    5. name = '两点水'
    6. print(name.__class__)
    7. # 函数
    8. def fu():
    9. pass
    10. print(fu.__class__)
    11. # 实例
    12. class eat(object):
    13. pass
    14. mEat = eat()
    15. print(mEat.__class__)

    输出的结果如下:

    1. <class 'int'>
    2. <class 'str'>
    3. <class 'function'>
    4. <class '__main__.eat'>

    可以看到,上面的所有东西,也就是所有对象都是通过类来创建的,那么我们可能会好奇,__class____class__ 会是什么呢?换个说法就是,创建这些类的类是什么呢?

    我们可以继续在上面的代码基础上新增下面的代码:

    1. print(age.__class__.__class__)
    2. print(name.__class__.__class__)
    3. print(fu.__class__.__class__)
    4. print(mEat.__class__.__class__)

    输出的结果如下:

    1. <class 'type'>
    2. <class 'type'>
    3. <class 'type'>
    4. <class 'type'>

    认真观察,再理清一下,上面输出的结果是我们把整形 age ,字符创 name ,函数 fu 和对象实例 mEat__class____class__ 打印出来的结果。也可以说是他们类的类打印结果。发现打印出来的 class 都是 type 。

    一开始也提到了,元类就是类的类。也就是元类就是负责创建类的一种东西。你也可以理解为,元类就是负责生成类的。而 type 就是内建的元类。也就是 Python 自带的元类。