一些很重要的知識,個人寫得有點亂,也能夠去看這些文章python
首先來看一個例子,正常狀況下咱們定義而且實例一個類以下3d
class Foo(object): def __init__(self): pass obj = Foo() # obj是經過Foo類實例化的對象
上述代碼中,obj 是經過 Foo 類實例化的對象,其實,不只 obj 是一個對象,Foo類自己也是一個對象,由於在Python中一切事物都是對象。code
print type(obj) # 輸出: Foo 表示,obj 對象由Foo類建立 print type(Foo) # 輸出:type表示,Foo類對象由 type 類建立
若是按照一切事物都是對象的理論:對象是經過執行Foo類的構造方法建立,那麼Foo類對象應該也是經過執行某個類的 構造方法 建立。對象
這裏和有必要提到一下在Python中有兩個最基本的對象,<type ‘object’> 和 <type ‘type’>,這兩個對象是全部對象的起源。blog
<type ‘type’>
的類型是<type ‘type’>
(它自己),<type ‘type’>
的父類是<type ‘object’>
繼承
<type ‘object’>
的類型是<type ‘type’>
,<type ‘object’>
沒有父類圖片
在Python對象系統中,<type ‘object’>和<type ‘type’>的關係就像雞和蛋的關係,不能說誰先於(建立)誰,二者是相互依賴的,共同構成了Python對象系統的基礎.有點難理解,不過沒有關係,知道有種這麼兩個東西就行了,比較咱們也不是設計Python的人,沒有必要搞的那麼清楚.
主要有兩種方式,不過本質上都是同樣的,都是經過type類來實例一個用戶類
普通方式 Python 1 class Foo(object): 2 3 def func(self): 4 print 'hello ' 特殊方式(type類的構造函數) Python 1 def func(self): 2 print 'hello ' 3 4 Foo = type('Foo',(object,), {'func': func}) 5 #type第一個參數:類名 6 #type第二個參數:當前類的基類 7 #type第三個參數:類的成員
由上面能夠看出來 , Foo類是由type類實例而來,那麼具體的建立的過程是怎麼樣的呢,接着往下面看:
new 和 __init()和__metaclass__:
__new__函數是實例一個類所要調用的函數,每當咱們調用obj = Foo()來實例一個類時,都是先調用__new__()
而後再調用__init__()函數初始化實例. __init__()在__new__()執行後執行,
類中還有一個屬性 __metaclass__,其用來表示該類由 誰 來實例化建立,因此,咱們能夠爲 __metaclass__ 設置一個type類的派生類,從而查看 類 建立的過程。
mytype產生一個叫作Foo的實例,主要的原理就是設置了,__metaclass__=MyTypoe,這樣就指定mytype類來實例foo類,若是Python沒有找到__metaclass__,它會繼續在(父類)中尋找 __metaclass__屬性,並嘗試作和前面一樣的操做。若是Python在任何父類中都找不到__metaclass__,它就會在模塊層次中去尋找__metaclass__,並嘗試作一樣的操做。若是仍是找不到__metaclass__,Python就會用內置的type來建立這個類對象。
mytype類中的__new__方法返回了一個對象,全部的Python實例都是這句代碼建立的type.__new__(cls,name,bases,attrs)
mytype的__init__()函數初始化Foo類,在這裏咱們能夠和在__new__()函數同樣設置Foo類的attr屬性,好比類中的方法,字段屬性等
和Foo類的建立過程同樣,studen類繼承了Foo類,因此重複123步驟,獲得一個studen類
當用戶使用Foo()或者studen()來實例類時,會默認調用類中的_new_()方法,要是之類裏面沒有這個方法就到父類裏面尋找__new__(),咱們能夠充分利用這個new函數,好比來實現Python中的單例模式,或者對類成員進行批量的修改等等.
產生了一個實例後立刻執行__init__()函數,進行初始化實例,
由上面的運行結果能夠看出,其中Foo和studen類的類型是<class '__main__.MyType'>,這也證實了Foo類和studen類都是由MyType實例而來…而第三個例子,能夠看出Foo2類的類型是<type 'type'>,這個並不例外,Foo2繼承了object類,(這個,仍是跳過吧,前面已經講過type和object相愛相殺的關係了)
首先,你知道了類實際上是可以建立出類實例的對象。好吧,事實上,類自己也是實例,固然,它們是元類的實例。Python中的一切都是對象,它們要麼是類的實例,要麼是元類的實例,除了type。type其實是它本身的元類,在純Python環境中這可不是你可以作到的,這是經過在實現層面耍一些小手段作到的。其次,元類是很複雜的。對於很是簡單的類,你可能不但願經過使用元類來對類作修改。你能夠經過其餘兩種技術來修改類:
Monkey patching
class decora