天天看點

Python之了解__new__和__init__的差別

很多同學都以為Python中的__init__是構造方法,但其實不然,Python中真正的構造方法是__new__。__init__和__new__有什麼差別?本文就來探讨一下。

class Person(object):
    def __init__(self, name, age):
        print("in __init__")
        self._name = name
        self._age = age 

p = Person("Wang", 33) 
           

上面的代碼會輸出如下的結果

in __init__
<__main__.Person object at 0x7fb2e0936450>
           

實際上,__init__函數并不是真正意義上的構造函數,__init__方法做的事情是在對象建立好之後初始化變量。真正建立執行個體的是__new__方法。我們來看下面的例子

class Person(object):
    def __new__(cls, *args, **kwargs):
        print("in __new__")
        instance = object.__new__(cls, *args, **kwargs)
        return instance

    def __init__(self, name, age):
        print("in __init__")
        self._name = name
        self._age = age

p = Person("Wang", 33)
           

上面的代碼輸出如下的結果

in __new__
in __init__
           

上面的代碼中執行個體化了一個Person對象,可以看到__new__和__init__都被調用了。__new__方法用于建立對象并傳回對象,當傳回對象時會自動調用__init__方法進行初始化。__new__方法是靜态方法,而__init__是執行個體方法。