天天看点

python生成对象内部执行过程

先后执行如下方法
__new__
      

__init__

Python中类方法、__new__方法和__init__方法解析 - Pykk2019 - 博客园​www.cnblogs.com/PyKK2019/p/11080129.html

1. __new__是构造方法,__init__是初始化函数。

2.__new__通常不需要手动定义,一般在元类编程中使用,控制类的生成过程。

3.__new__第一个被执行,然后执行__init__绑定实例变量。

4.__new__必须有返回值,返回值是该类的实例,它会被__init__函数接收,通常叫做self变量

class MyClass:

def __new__(cls, a):

return super().__new__(cls)

def __init__(self, a):

self.a = a

obj = MyClass(3)

print(obj.a)

1.__new__是类方法,所以第一个参数也是cls,剩下的参数就是构造方法里需要的参数了。通常__new__都不需要定义,在元类编程中才需要,它可以控制类的生成过程。

__new__必须返回一个实例(instance),传入到__init__方法中的self参数,也就是实例变量。这里返回父类(object)的__new__方法用来创建一个新的实例。相当于

obj = object.__new__(MyClass)

obj = MyClass() #obj是实例,上面两个方式等同

其中,MyClass是类,obj是实例(instance)

2. __new__是构造方法,那么__init__就是初始化函数,它负责将变量绑定到实例中,更新实例的__dict__字典。其中第一个参数self就是__new__的返回值,是类的实例。__new__方法先于__init__方法执行

3. 如果__new__创建的是当前类的实例,会自动调用__init__函数,通过return语句里面调用的__new__函数的第一个参数是cls来保证是当前类实例,如果是其他类的类名,;那么实际创建返回的就是其他类的实例,其实就不会调用当前类的__init__函数,也不会调用其他类的__init__函数。

__new__和__init__的区别 - 知乎

python魔法方法__new__() 和 __init__() - 知乎