返回

解剖 Python 类:深入 CPython 源码揭开 OOP 神秘面纱

后端

Python,作为一门高度动态且通用的编程语言,为开发人员提供了强大的面向对象编程(OOP)能力。为了透彻理解 Python OOP 的内在运作机制,我们深入 CPython 源码,揭开类的实现的神秘面纱。

Python 中类的构成:object 和 type

Python 中的类本质上是由两个特殊对象构建的:object 和 type。object 是所有 Python 对象的基类,而 type 负责和控制类实例的行为。

object:

  • 是 Python 中所有对象的基类,提供所有对象的基本方法和属性。
  • 定义了 __init__ 构造函数、__str__ 字符串表示、__repr__ 调试表示等基本方法。
  • 拥有 __class__ 属性,指向创建该对象的类。

type:

  • 和控制类实例的行为。
  • 定义了类的属性、方法和其他特性。
  • 通过 type() 内置函数创建,接受类名和元组(包含基类和名称空间)作为参数。
  • 具有 __name____bases____dict__ 等属性,用于访问类元数据。

类实例化:揭秘 __new____init__

当创建类实例时,Python 会首先调用 __new__ 方法来创建实例对象,然后调用 __init__ 方法对其进行初始化。

new(cls, *args, ** kwargs)

  • cls 参数是指当前类。
  • *args**kwargs__init__ 方法的参数。
  • 负责创建实例对象,并返回该对象。

init(self, *args, ** kwargs)

  • self 参数是指刚创建的实例对象。
  • *args**kwargs__new__ 方法的参数。
  • 对实例对象进行初始化,设置其属性并执行其他必要的操作。

类的属性和方法:深入 __dict____getattr__

类的属性和方法通过 __dict__ 属性和 __getattr__ 特殊方法访问。

dict

  • 类的一个属性,存储着类的属性名称和值。
  • 类的属性可以通过 obj.__dict__ 访问,其中 obj 是类的实例。

getattr(self, name)

  • 当访问一个不存在的属性时,Python 会调用此特殊方法。
  • 可以实现自定义逻辑来动态获取或设置属性。

类的继承:探索 __bases__ 和 MRO

Python 允许类继承自其他类,通过 __bases__ 属性和方法解析顺序(MRO)来确定继承关系。

bases

  • 类的一个属性,是一个元组,包含当前类的基类。

MRO(方法解析顺序):

  • 确定方法调用的顺序,考虑了多重继承的情况。
  • 通过 type.__mro__ 属性访问。

剖析 Python 类的实现:CPython 源码之旅

为了深入理解 Python 类的实现,我们探索 CPython 源码,特别是 Objects/classobject.cObjects/typeobject.c 模块。

classobject.c:

  • 定义了 PyClassObject 结构体,它存储了类的信息。
  • 包含了 __new____init__ 等特殊方法的实现。

typeobject.c:

  • 定义了 PyTypeObject 结构体,它描述了类的行为。
  • 包含了 __dict____getattr__ 等特殊属性和方法的实现。

SEO 关键词: