3.md 2.5 KB
Newer Older
1 2
# 三、什么是元类 #

T
TwoWater 已提交
3
通过上面的介绍,终于模模糊糊的带到元类这里来了。可是我们到现在还不知道元类是什么鬼东西。
4

T
TwoWater 已提交
5 6 7 8 9
我们创建类的时候,大多数是为了创建类的实例对象。

那么元类呢?

**元类就是用来创建类的。也可以换个理解方式就是:元类就是类的类。**
10 11 12 13 14 15 16

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

```python	
MyClass = type('MyClass', (), {})
```

T
TwoWater 已提交
17 18 19
**实际上 `type()` 函数是一个元类。**

`type()` 就是 Python 在背后用来创建所有类的元类。
20 21 22

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

T
TwoWater 已提交
23 24 25 26 27 28 29 30 31
这可能是为了和 str 保持一致性,str 是用来创建字符串对象的类,而 int 是用来创建整数对象的类。

type 就是创建类对象的类。

你可以通过检查 `__class__` 属性来看到这一点。

Python 中所有的东西,注意喔,这里是说所有的东西,他们都是对象。

这包括整数、字符串、函数以及类。它们全部都是对象,而且它们都是从一个类创建而来。
32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68

```python
# 整形
age = 23
print(age.__class__)
# 字符串
name = '两点水'
print(name.__class__)


# 函数
def fu():
    pass


print(fu.__class__)


# 实例
class eat(object):
    pass


mEat = eat()

print(mEat.__class__)
```

输出的结果如下:

```
<class 'int'>
<class 'str'>
<class 'function'>
<class '__main__.eat'>
```

T
TwoWater 已提交
69 70 71
可以看到,上面的所有东西,也就是所有对象都是通过类来创建的,那么我们可能会好奇,`__class__``__class__` 会是什么呢?

**换个说法就是,创建这些类的类是什么呢?**
72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90

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

```python
print(age.__class__.__class__)
print(name.__class__.__class__)
print(fu.__class__.__class__)
print(mEat.__class__.__class__)
```

输出的结果如下:

```
<class 'type'>
<class 'type'>
<class 'type'>
<class 'type'>
```

T
TwoWater 已提交
91 92 93 94 95 96 97 98 99 100 101
认真观察,再理清一下,上面输出的结果是我们把整形 `age` ,字符创 `name` ,函数 `fu` 和对象实例 `mEat``__class__``__class__` 打印出来的结果。

也可以说是他们类的类打印结果。发现打印出来的 class 都是 type 。

一开始也提到了,元类就是类的类。

也就是元类就是负责创建类的一种东西。

你也可以理解为,元类就是负责生成类的。

**而 type 就是内建的元类。也就是 Python 自带的元类。**
102