【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变量
posted @ 2022-09-19 16:26  键上一指禅  阅读(13)  评论(0编辑  收藏  举报