__new__
和__init__
区别
-
__new__
至少有一个cls 参数,必须有返回值,返回初始化实例实例:
object.__new__(cls)
orsuper(Singleton, cls).__new__(cls, *args, **kw)
-
__init__
有个self参数,就是__new__
返回的实例,没有返回值
不可变,可变类型
-
不可变 数值 str bool tuple
不允许变量值变化,值改变了相当于新建对象,相同值对象,只有一个地址
-
可变数据类型 list dict
对变量操作,不会创建对象
copy deepcopy
-
对于不可变 数值 str bool tuple是一样的 和赋值是一样
-
对于可变对象
-
copy
- 源对象无复杂子对象,原值和复制值不会互相影响
- 源对象有复杂子对象, 会互相影响
-
deepcopy
- 完全独立
新旧类
Python 2.x中默认都是经典类,只有显式继承了object才是新式类
- 完全独立
-
Python 3.x中默认都是新式类,经典类被移除,不必显式的继承object
-
新式类都从object继承,经典类不需要。
-
新式类的MRO(method resolution order 基类搜索顺序)算法采用C3算法广度优先搜索,而旧式类的MRO算法是采用深度优先搜索
-
新式类相同父类只执行一次构造函数,经典类重复执行多次。