python實例化對象過程
Python中存在着一種靜態的__new__()方法,通常在定義類時不會重寫__new__()方法,於是Python在調用類時會自動尋找該類的繼承對象(本例中為Object),然后返回當前類的實例對象:
def __new__(cls, *args, **kwargs): ... return object.__new__(cls) #執行object的__new__()函數
執行object的__new__()函數后會返回實例對象(self),然后將self作為第一個參數傳給該類的初始化方法__init__()方法。這里self只是實例對象的一個名字,也是Python里約定俗成的一種叫法,可以自定義其名稱。
當運行c1 = Myclass(11)代碼時其實做了兩個動作:
class Myclass(object): def __init__(self, x): self.x = x c1 = Myclass(11) #相當於隱式執行了__new__()和__init() c2 = Myclass.__new__(Myclass, 12) #顯式調用__new__(),返回c2對象 c2.__init__( 12) #顯示調用__init(),完成c2的初始化 print c1.x, c2.x
輸出: 11 12
__new__和__metaclass__
在python中,一切皆對象,我們定義的類其實。。。也是一個對象,那么,類本身是誰的對象呢?在python2.2之前(或者叫經典類中),所有的類,都是class的對象,但是在新式類中,為了將類型(int,str,float等)和類統一,所以,所有的類都是type類型的對象。當然,這個規則可以被修改,在類中有一個屬性 __metaclass__ 可以指定當前類該由哪個類進行實例化。而創建對象過程中,其實構造器不是__init__方法,而是__new__方法,這個方法會返回一個對象,這才是對象的構造器。
下面是一個解釋類實例化對象內部實現過程的代碼段:
class Mytype(type): def __init__(self, what, bases=None, dict=None): super(Mytype,self).__init__(what, bases, dict) def __call__(self, *args, **kwargs): obj=self.__new__(self) self.__init__(obj, *args, **kwargs) return obj class Foo: __metaclass__=Mytype def __init__(self,name,age): self.name=name self.age=age def __new__(cls, *args, **kwargs): return object.__new__(cls) obj=Foo("xiaoming",18) print(obj.name,obj.age)
執行結果:xiaoming 18