Python 小结

__new__ __init__区别

  • __new__ 至少有一个cls 参数,必须有返回值,返回初始化实例

    实例: object.__new__(cls) or super(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算法是采用深度优先搜索

  • 新式类相同父类只执行一次构造函数,经典类重复执行多次。

image-20210624081437117