python __new__ __init__ 区别

  1. 参数
    • __new__的第一个占位参数是class对象
    • __init__的第一个占位参数是class的实例对象
    • 其他的参数应一致
  2. 作用
    • __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'>

 

posted @ 2018-04-25 08:54  wuxinyan  阅读(141)  评论(0编辑  收藏  举报