Skip to content

关于 init() 的一个常见误解

A Common Misconception About init()

大多数 Python 程序员都误解了 Python OOP 中的 init 魔术方法。他们以为它会创建一个新对象,也就是为对象分配内存。例如,看看下面这个 Point2D 类:

ds p517 1

假设这里还有一个 repr 方法,只是没有显示出来。当我们创建一个对象时(如下所示),程序员们会认为在背后是 init 方法在为他们的对象分配内存:

ds p517 2

但事实并非如此。当我们在 Python 中创建任何对象时,init 方法从来都不会为它分配内存。

顾名思义,init 只是为对象的属性赋值,也就是初始化属性。真正负责创建新对象并为之分配内存的,其实是 new() 这个魔术方法。为了更好地理解,看看下面这个类的实现。

ds p518 1

在这里,我们实现了 new() 方法,它会检查传入的参数是否为整数类型。现在,如果我们尝试创建这个类的一个对象,Python 会先校验 new() 方法中指定的条件,只有当指定条件为真时才会创建一个新对象。这从下图可以清楚地看出来:

ds p518 2

new 方法的另一个常见用例是定义单例类(singleton)——即只能拥有一个对象的类。例如,看看下面这个类的实现:

ds p519 1

在上面这段代码中,new 方法定义了一个类变量 _class_count。当新对象被实例化时,如果 _class_count 的值为 0,就把 _class_count 更新为 1 并返回该对象。在创建第一个对象之后,就永远无法再创建新对象了,因为 _class_count 的值永远不会是 0。这从下图可以清楚地看出来:

ds p519 2

本站内容仅供学习交流,版权归原作者所有。