返回 类实例化:揭秘
类的属性和方法:深入
类的继承:探索
解剖 Python 类:深入 CPython 源码揭开 OOP 神秘面纱
后端
2023-12-19 22:06:49
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.c
和 Objects/typeobject.c
模块。
classobject.c:
- 定义了
PyClassObject
结构体,它存储了类的信息。 - 包含了
__new__
、__init__
等特殊方法的实现。
typeobject.c:
- 定义了
PyTypeObject
结构体,它描述了类的行为。 - 包含了
__dict__
、__getattr__
等特殊属性和方法的实现。