Python中__new__和__init__的区别
2014-07-30
Python  / 已有2426人围观

刚开始使用Python的时候完全分不清楚__new__和__init__的区别,不清楚它们在Python中各自的用途,熟悉之后发现它们的用途就像它们各自字面上的意思一样,很容易理解。

一、示例

先给个例子看看:

class Test(object):
    _dict = {}

    def __new__(cls):
        """ class method """
        if 'key' in Test._dict:
            print "EXISTS"
            return Test._dict['key']
        else:
            print "NEW"
            return super(Test, cls).__new__(cls)

    def __init__(self):
        """ instance method """
        print "INIT"
        Test._dict['key'] = self


if __name__ == "__main__":
    t1 = Test()
    t2 = Test()

"""
Output:

NEW
INIT
EXISTS
INIT
"""

二、new & init区别

总的来说,当我们需要控制object的创建操作时,我们需要重写__new__方法;当我们需要控制object的初始化操作时,我们需要重写__init__方法。所以,在大部分情况下,我们不需要去关心object的__new__方法(除非你需要实现str,int,unicode这些不可改变的类的子类),一般只需要重写__init__方法,在对象初始化的时候添加自己的逻辑。

通过上面示例中打印出来的信息,我们可以知道:在创建一个对象的时候,__new__方法会被最先调用,然后会返回一个object实例;在这之后,__init__方法才会被调用,它不返回任何信息,只是初始化对象,给对象的属性赋值。

从上面的例子中可以看到:new和init的方法定义分别是def __new__(cls)和def __init__(self),所以,__new__方法是一个类方法,而__init__是个实例方法。__new__方法返回的对象会传给__init__方法的self参数。

OK,需要说明的就是这些,其实__new__和__init__的区别还是比较明显的,很容易理解。


Over!

本文地址:http://xianglong.me/article/learn-python-8-new-init/

特别声明:本站文章,如非注明,皆为降龙原创。转载需注明本文链接并保证链接可用。