new 方法

使用 类名() 创建对象时,Python 的解释器 首先 会 调用 __new__ 方法为对象 分配空间

new 是一个 由 object 基类提供的 内置的静态方法,主要作用有两个:

  1. 在内存中为对象 分配空间
  2. 返回 对象的引用

Python 的解释器获得对象的 引用 后,将引用作为 第一个参数,传递给 init 方法
重写 new 方法 的代码非常固定!

重写 new 方法 一定要 return super().new(cls)

否则 Python 的解释器 得不到 分配了空间的 对象引用,就不会调用对象的初始化方法

注意:new 是一个静态方法,在调用时需要 主动传递 cls 参数
Python 中的单例
* 单例 —— 让 类 创建的对象,在系统中 只有 唯一的一个实例

1. 定义一个 类属性,初始值是 None,用于记录 单例对象的引用
	2. 重写 __new__ 方法
	3. 如果 类属性 is None,调用父类方法分配空间,并在类属性中记录结果
	4. 返回 类属性 中记录的 对象引用

只执行一次初始化工作
在每次使用 类名() 创建对象时,Python 的解释器都会自动调用两个方法:

new 分配空间

init 对象初始化

在上一小节对 new 方法改造之后,每次都会得到 第一次被创建对象的引用

但是:初始化方法还会被再次调用

捕获异常 try…except…

私有化

xx: 公有变量

_x: 单前置下划线,私有化属性或方法,from somemodule import *禁止导入,类对象和子类可以访问

__xx:双前置下划线,避免与子类中的属性命名冲突,无法在外部直接访问(名字重整所以访问不到)

xx:双前后下划线,用户名字空间的魔法对象或属性。例如:init , __ 不要自己发明这样的名字

xx_:单后置下划线,用于避免与Python关键词的冲突

通过name mangling(名字重整(目的就是以防子类意外重写基类的方法或者属性)如:_Class__object)机制就可以访问private了。

父类中属性名为__名字的,子类不继承,子类不能访问

如果在子类中向__名字赋值,那么会在子类中定义的一个与父类相同名字的属性

_名的变量、函数、类在使用from xxx import *时都不会被导入

属性property

私有属性添加getter和setter方法
使用property升级getter和setter方法
使用property取代getter和setter方法

==和is

is 是比较两个引用是否指向了同一个对象(引用比较)。
== 是比较两个对象是否相等。

浅拷贝
浅拷贝是对一个对象的顶层拷贝
通俗的理解就是:拷贝了引用,并没有拷贝内容

深拷贝
深拷贝是对于一个对象所有层次的拷贝(递归)
拷贝的其他方式
浅拷贝对不可变类型和可变类型的copy不同