python實例化對象過程


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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM