Python学习笔记:__new__与__init__及类复制详解

需积分: 5 0 下载量 195 浏览量 更新于2024-08-04 收藏 10KB MD 举报
在本篇Python笔记中,我们主要探讨了Python中创建对象的两个关键方法:`__new__` 和 `__init__`,以及它们在实例化过程中起到的作用。`__new__` 函数在创建新对象时被调用,负责初始化对象的类型(即类)并返回一个新对象,而`__init__` 方法则在对象创建后被调用,主要用于设置对象的初始状态。 首先,`__new__` 方法演示了创建对象的过程。当我们定义一个类如`Person`时,`__new__` 函数在实例化时被自动调用。在这个例子中,`cls` 参数代表类本身,`*args` 和 `**kwargs` 分别表示可变数量的位置参数和关键字参数。`super().__new__(cls)` 是调用父类的`__new__`,以便继承父类的行为。`return obj` 表示创建并返回新对象。 接下来,`__init__` 方法用于初始化对象属性,如`name`和`age`,并将这些属性绑定到新创建的对象上。当创建`Person` 类的实例`p1`时,`__init__` 被调用,并设置了其属性值。 关于类的赋值和拷贝,这里提到了浅拷贝和深拷贝的概念。在Python中,简单的变量赋值操作并不会复制对象本身,而是创建一个新的引用,也就是说,源对象和目标对象实际上是共享内存地址的。这种行为在浅拷贝中体现,例如使用`copy`模块中的`copy()`函数或序列类型(如列表、元组)的切片操作。 然而,如果对象内部包含复杂的数据结构(如嵌套的对象),浅拷贝可能不足以满足需求,因为这些子对象不会被复制。此时,需要使用`copy`模块的`deepcopy()`函数来实现深度拷贝,它会递归地复制对象及其所有子对象,确保源对象和拷贝对象之间完全独立,包括它们所包含的所有数据。 在给出的代码中,`Cpu`、`Disk` 和 `Computer` 类作为示例展示了可能的继承结构,而在创建`Computer` 对象时,如果只做浅拷贝,`cpu` 和 `disk` 属性将会指向相同的实例。要实现深度拷贝,需要在`Computer` 类中显式调用`deepcopy` 函数来复制子对象。 总结来说,本笔记深入剖析了Python中对象创建的关键环节,以及如何处理不同类型的对象复制,这对于理解面向对象编程的实质和优化内存管理具有重要意义。