__new__和__init__
""" 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()