# 类机制概述

# 概述

在 Python 中,所有东西都是对象,类也不例外。Python 中的类机制是通过构建类对象的方式实现的,每个类对象可以有多个实例对象。类对象包括类的名称,类的父类(也称为超类或基类)的元组,类的命名空间以及指向类定义体的代码对象。类定义体是由类内定义的函数和变量组成的代码块。

从 CPython 的源代码实现角度来看,每个类都是一个 PyTypeObject 结构体实例。此结构体表示 Python 对象类型,其中包括对象的基本属性,例如名称、大小、实例变量的数量、方法、基类和各种类型标志。

创建类时,解释器创建一个类的命名空间,以及一个 PyTypeObject 结构体实例,并将命名空间赋值给 PyTypeObject 结构体实例的 tp_dict 成员。此时,类已经创建完毕。

然后,Python 解释器会在类的命名空间中执行类定义体代码,以构建类的方法、属性和其他成员。其中,类的方法是函数对象,存储在类的命名空间中的变量中。

当程序需要创建类的实例时,Python 解释器会创建一个 PyInstanceObject 结构体实例,其中包括指向类 PyTypeObject 结构体实例的指针以及实例变量。

总结一下,Python 类机制的主要实现方式是通过创建类的 PyTypeObject 结构体实例,并将类定义体中的所有函数和变量添加到类的命名空间中。类的实例是通过 PyInstanceObject 结构体实例表示的,其中包括一个指向类 PyTypeObject 结构体实例的指针和实例变量。

# 类属性空间

类的__dict__​字段存储着其属性空间:

>>> class Dog:
...     def yelp(self):
...         print('woof')
...
>>> Dog.legs = 4
>>> Dog.__dict__.keys()
dict_keys(['__module__', 'yelp', '__dict__', '__weakref__', '__doc__', 'legs'])

因此我们甚至可以通过对这个__dict__​对应的dict​进行操作去改变类的行为(慎):


>>> def yelp2(self):
...     print('surprise')
...
>>> Dog.yelp2 = yelp2
>>> dog.yelp2()
surprise

image