__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()

  

posted @ 2020-12-20 13:15  Yuan_x  阅读(79)  评论(0编辑  收藏  举报