Python執行個體一個類背後發生了什麼

來源:互聯網
上載者:User
首先來看一個例子,正常情況下我們定義並且執行個體一個類如下

class Foo(object):   def __init__(self):    pass obj = Foo()  # obj是通過Foo類執行個體化的對象

上述代碼中,obj 是通過 Foo 類執行個體化的對象,其實,不僅 obj 是一個對象,Foo類本身也是一個對象,因為在Python中一切事物都是對象。

print type(obj) # 輸出: Foo 表示,obj 對象由Foo類建立
print type(Foo) # 輸出:type表示,Foo類對象由 type 類建立
如果按照一切事物都是對象的理論:對象是通過執行Foo類的構造方法建立,那麼Foo類對象應該也是通過執行某個類的 構造方法 建立。

一、兩個基本的類
這裡和有必要提到一下在Python中有兩個最基本的對象, 和 ,這兩個對象是所有對象的起源。

1、的類型是(它本身),的父類是
2、的類型是,沒有父類
在Python對象系統中,和的關係就像雞和蛋的關係,不能說誰先於(建立)誰,兩者是相互依賴的,共同構成了Python對象系統的基礎.有點難理解,不過沒有關係,知道有種這麼兩個東西就好了,比較我們也不是設計Python的人,沒有必要搞的那麼清楚.

二、類的建立
主要有兩種方式,不過本質上都是一樣的,都是通過type類來執行個體一個使用者類

//普通方式  class Foo(object):     def func(self):  print 'hello wupeiqi'//特殊方式(type類的建構函式)  def func(self):    print 'hello wupeiqi'    Foo = type('Foo',(object,), {'func': func}) #type第一個參數:類名 #type第三個參數:類的成員

由上面可以看出來 , Foo類是由type類執行個體而來,那麼具體的建立的過程是怎麼樣的呢,接著往下面看:

來瞭解幾個概念
new __init()__metaclass__:

  • __new__函數是執行個體一個類所要調用的函數,每當我們調用obj = Foo()來執行個體一個類時,都是先調用__new__()
  • 然後再調用__init__()函數初始化執行個體. __init__()在__new__()執行後執行,
  • 類中還有一個屬性 __metaclass__,其用來表示該類由 誰 來執行個體化建立,所以,我們可以為 __metaclass__ 設定一個type類的衍生類別,從而查看 類 建立的過程。

三、闡述運行過程

1、mytype產生一個叫做Foo的執行個體,主要的原理就是設定了,__metaclass__=MyTypoe,這樣就指定mytype類來執行個體foo類,如果Python沒有找到__metaclass__,它會繼續在(父類)中尋找 __metaclass__屬性,並嘗試做和前面同樣的操作。如果Python在任何父類中都找不到__metaclass__,它就會在模組層次中去尋找__metaclass__,並嘗試做同樣的操作。如果還是找不到__metaclass__,Python就會用內建的type來建立這個類對象。
2、mytype類中的__new__方法返回了一個對象,所有的Python執行個體都是這句代碼建立的type.__new__(cls,name,bases,attrs)
3、mytype的__init__()函數初始化Foo類,在這裡我們可以和在__new__()函數一樣設定Foo類的attr屬性,比如類中的方法,欄位屬性等
4、和Foo類的建立過程一樣,studen類繼承了Foo類,所以重複123步驟,得到一個studen類
5、當使用者使用Foo()或者studen()來執行個體類時,會預設調用類中的_new_()方法,要是之類裡面沒有這個方法就到父類裡面尋找__new__(),我們可以充分利用這個new函數,比如來實現Python中的單例模式,或者對類成員進行批量的修改等等.
6、產生了一個執行個體後馬上執行__init__()函數,進行初始化執行個體,
7、由上面的運行結果可以看出,其中Foo和studen類的類型是,這也證明了Foo類和studen類都是由MyType執行個體而來…而第三個例子,可以看出Foo2類的類型是,這個並不例外,Foo2繼承了object類,(這個,還是跳過吧,前面已經講過type和object相愛相殺的關係了)
總結
首先,你知道了類其實是能夠建立出類執行個體的對象。好吧,事實上,類本身也是執行個體,當然,它們是元類的執行個體。Python中的一切都是對象,它們要麼是類的執行個體,要麼是元類的執行個體,除了type。type實際上是它自己的元類,在純Python環境中這可不是你能夠做到的,這是通過在實現層面耍一些小手段做到的。其次,元類是很複雜的。對於非常簡單的類,你可能不希望通過使用元類來對類做修改。你可以通過其他兩種技術來修改類:

1、Monkey patching
2、class decora

以上就是本文的詳細內容,希望對大家的學習有所協助。

  • 聯繫我們

    該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

    如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

    A Free Trial That Lets You Build Big!

    Start building with 50+ products and up to 12 months usage for Elastic Compute Service

    • Sales Support

      1 on 1 presale consultation

    • After-Sales Support

      24/7 Technical Support 6 Free Tickets per Quarter Faster Response

    • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.