8.4 __new__ 和 __init__ 的区别

  • 自定义类中 __new__: 用来控制对象的生成过程,返回 self 对象,如果没有返回值,则不会调用 __init__
  • 自定义类中 __init__: 用来完善对象,如初始化
  • __new__ 在 __init__ 之前调用
class User(object):

    # 新式类才有,生成对象 user 之前加逻辑
    def __new__(cls, *args, **kwargs):
        # args = ('linda', )
        # kwargs = {'age': 20}
        # 与自定义 metaclass 中的 __new__ 有区别
        print('from __new__')
        self = super().__new__(cls)
        return self

    def __init__(self, name, age=18):
        self.name = name
        self.age = age
        print('from __init__')


if __name__ == '__main__':
    user = User('linda', age=20)

PS: 统一描述

  • 元类 -> 类对象
  • 类 -> 实例