python __new__ __init__ 区别
- 参数
- __new__的第一个占位参数是class对象
- __init__的第一个占位参数是class的实例对象
- 其他的参数应一致
- 作用
- __new__ 用来创建实例,在返回的实例上执行__init__,如果不返回实例那么__init__将不会执行
- __init__ 用来初始化实例,设置属性等其它初始化的动作
__new__在Python中是真正的构造方法(创建并返回实例),通过这个方法可以产生一个”cls”对应的实例对象,所以说”new”方法一定要有返回。
__init__是一个初始化的方法,”self”代表由类产生出来的实例对象,”init”将对这个对象进行相应的初始化操作。
class A(object): def __init__(self,*args,**kwargs): print ("calling __init__ from %s" % self.__class__) def __new__(cls,*args,**kwargs): obj = object.__new__(cls,*args,**kwargs) print ("calling __new__ from %s" % obj.__class__) return obj class B(A): def __init__(self,*args,**kwargs): print ("calling __init__ from %s" % self.__class__) def __new__(cls,*args,**kwargs): obj = object.__new__(A,*args,**kwargs) print ("calling __new__ from %s" % obj.__class__) return obj b=B() print (type(b))
在B的”new”方法中,通过”obj = object.new(A, *args, **kwargs)”创建了一个A的实例,在这种情况下,B的”init”函数就不会被调用到。
输出为:
calling __new__ from <class '__main__.A'> <class '__main__.A'>