"""
1 继承自 object的新式类 才会有__new__
2 __new__ 必须要有一个参数cls 代表当前类 此参数在实例化时由 python解释器自动识别
3 __new__ 必须要有返回值 返回实例化出来的实例
这点在自己实现new方法的时候需要特别的注意 可以return 父类(通过supper(当前类名,cls).__new__出来的实例))
或者直接就是object的__new__出来的实例
4 __init__ 的self参数 其实就是self就是new返回的实例,init在new 的基础上可以完成一些其他的初始化动作 init不需要返回值
5 如果new创建的是当前类的实例 会自动调用init方法完成初始化,通过return语句里面调用的new函数的第一个cls来保证是当前类的实例
如果是其他类的类名 那么实际上创建返回的就是其他类的实例 其实就不会调用当前类的init函数 但是会调用返回实例的init方法
6 如果 新式类中重写了new方法 那么可以自由选择任意一个的其他的新式类(只有新式类才会有new 并且所有的新式类都是object的子类
而经典类没有new方法)new方法来制造实例 包括这个新式类的所有前代类和后袋类,只要他们不会造成递归死循环
7 在任何新式类中new方法中 不能调用自身的__new__() 来制造实例 会造成死循环 必须要避免一下类似的洗发
return A.__new__(cls,*args,*kwargs)或者 cls.__new__(cls,*args,*kwargs)
使用object或者没有血缘关系的新式类的__new__() 是安全的 但是如果是在有继承关系的2个类之间,应该避免死循环
例如
在A中 return B.__new__(cls,*args,**kwargs)
在B中 return A.__new__(cls,*args,**kwargs)
"""
class A(object):
def __new__(cls, *args, **kwargs):
print("in A __new__---->%s"%(cls))
return object.__new__(cls, *args, **kwargs)
def __init__(self,*args, **kwargs):
print("in A __init__")
self.a=123
class B(A):
def __new__(cls, *args, **kwargs):
return super().__new__(cls, *args, **kwargs)
def __init__(self, *args, **kwargs):
print("in B init")
if __name__ == '__main__':
a=B()