上代码!
class A: def __new__(cls, *args, **kwargs): obj = super().__new__(cls) print("__new__ ", obj) # <__main__.A object at 0x00000000021D76A0> return obj def __init__(self, name, age): print("__init__ ", self) # <__main__.A object at 0x00000000021D76A0> self.name = name self.age = agea = A('sath', 22)print(a) # <__main__.A object at 0x00000000021D76A0>
# 可以看出三次打印都是同一个内存地址
# 执行的顺序为: __new__ >>>>> __init__ >>>>> a
# 一个完整的实例化对象过程:
# 1. 当执行到类名加括号时, 首先执行"__new__"开辟一块内存空间, 并且携带了你要给对象封装的属性# 2. 将开辟的空间和要封装的对象属性return给"__init__"# 3. "__init__" 初始化这一块对象的内存空间, 将属性封装进这个内存空间中# 4. 对象空间初始化完成后, 将这个空间返回给调用者, 得到一个类型为"A"的对象"a"