【Python】__new__和__init__区别
from logzero import logger class Person(object): # __new__方法接受的参数虽然也是和__init__一样,但__init__是在类实例创建之后调用,而__new__方法正是创建这个类实例的方法 def __new__(cls, name, age): logger.info('__new__ called') return super(Person, cls).__new__(cls) # __init__方法通常用在初始化一个类实例的时候 def __init__(self, name, age): logger.info('__init__ called') self.name = name self.age = age def __str__(self): return f"Person:{self.name}({self.age})" if __name__ == '__main__': lisi= Person('lisi', 18) logger.info(lisi)
# 1. p = Person(name, age)
# 2. 首先执行使用name和age参数来执行Person类的__new__方法,这个__new__方法会 返回Person类的一个实例(通常情况下是使用 super(Persion, cls).__new__(cls) 这样的方式)
# 3. 然后利用这个实例来调用类的__init__方法,上一步里面__new__产生的实例也就是 __init__里面的的 self
所以,__init__ 和 __new__ 最主要的区别在于:
# 1.__init__ 通常用于初始化一个新实例,控制这个初始化的过程,比如添加一些属性, 做一些额外的操作,发生在类实例被创建完以后。它是实例级别的方法。
# 2.__new__ 通常用于控制生成一个新实例的过程。它是类级别的方法。
# 3.__new__是构造方法,__init__是初始化函数。
# 4.__new__通常不需要手动定义,一般在元类编程中使用,控制类的生成过程。
# 5.__new__第一个被执行,然后执行__init__绑定实例变量。
# 6.__new__必须有返回值,返回值是该类的实例,它会被__init__函数接收,通常叫做self变量