摘要:好吧,事實上,類本身也是實例,當然,它們是元類的實例。中的一切都是對象,它們要么是類的實例,要么是元類的實例,除了。
寫在最前面
一些很重要的知識,我的寫得有點亂,也可以去看這些文章
Python 面向對象(初級篇)
Python 面向對象(進階篇)
深刻理解Python中的元類(metaclass)
首先來看一個例子,正常情況下我們定義并且實例一個類如下
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中有兩個最基本的對象,
在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類的類型是
首先,你知道了類其實是能夠創建出類實例的對象。好吧,事實上,類本身也是實例,當然,它們是元類的實例。Python中的一切都是對象,它們要么是類的實例,要么是元類的實例,除了type。type實際上是它自己的元類,在純Python環境中這可不是你能夠做到的,這是通過在實現層面耍一些小手段做到的。其次,元類是很復雜的。對于非常簡單的類,你可能不希望通過使用元類來對類做修改。你可以通過其他兩種技術來修改類:
Monkey patching
class decora
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/37754.html
摘要:小總結標準庫里的所有映射類型都是利用來實現只有可散列的數據類型才能用作這些映射里的鍵值不用字典推導用處理找不到的鍵找不到鍵返回某種默認值底層是與調用實現的字典插入更新原理其他大多數映射類型都提供了兩個很強大的方法和。 字典和集合 標準庫里的所有映射類型都是利用 dict 來實現的只有可散列的數據類型才能用作這些映射里的鍵(值不用) 可散列 一個對象是可散列的 它的散列值是不變的 對象...
摘要:之所以想寫這個文章是因為碰巧看到網上一篇關于中類屬性及實例屬性區別的帖子。中屬性的獲取對于屬性,我們通常采用類屬性或實例屬性的形式調用。最關鍵的地方在于兩點理解是如何利用查找樹的機制來模仿類及實例之間的關系理解動態語言是可以動態設置屬性的 標題名字有點長。 之所以想寫這個文章是因為碰巧看到網上一篇關于Pyhon中類屬性及實例屬性區別的帖子。因為我之前也被這個問題困擾過,今天碰巧看到了...
摘要:一介紹隨著社區的框架的發布,社區也終于誕生了屬于自己的前后端同構框架。本文主要研究的運行原理,分析它從接收一條指令,到完成指令背后所發生的一系列事情。最后,通過來檢查輸出的是否存在問題,然后發出通知,表明可用。 showImg(https://segmentfault.com/img/bVIc9l?w=536&h=136); 一、介紹 Nuxt.js - Universal Vue.j...
摘要:第行把具名元組以的形式返回。對序列使用和通常號兩側的序列由相同類型的數據所構成當然不同類型的也可以相加,返回一個新序列。從上面的結果可以看出,它雖拋出了異常,但仍完成了操作查看字節碼并不難,而且它對我們了解代碼背后的運行機制很有幫助。 《流暢的Python》筆記。接下來的三篇都是關于Python的數據結構,本篇主要是Python中的各序列類型 1. 內置序列類型概覽 Python標準庫...
閱讀 2581·2021-11-22 12:01
閱讀 1105·2021-11-15 11:37
閱讀 3685·2021-09-22 14:59
閱讀 1746·2021-09-04 16:45
閱讀 1382·2021-09-03 10:30
閱讀 1013·2021-08-11 11:18
閱讀 2459·2019-08-30 10:53
閱讀 2013·2019-08-29 15:13