在將物件的建立和行為之前,我們先來看一下型別物件,python是弱型別語言,但並不代表python沒有型別,python中處理物件的型別有乙個專門的物件,我們稱之為型別物件,如果不知道物件的型別就無法為物件開闢記憶體空間,因為占用記憶體的大小是物件的元資訊,是物件的基本資訊,這與物件所屬型別密切相關,因此,他一定回出現在python物件所對應的型別物件中,開啟python原始碼中的include資料夾的object.h檔案,檢視pytypeobject的原始碼,在大約第324行:
typedef struct _typeobject pytypeobject;
上面這段**很長,乙個結構體100多行,不過所包含的資訊主要分為如下四大類:
1、型別名,tp_name,主要是python內部以及除錯時使用,用來識別物件的所屬型別;
2、tp_basicsize和tp_itemsize,建立該類物件分配記憶體空間的大小的資訊;
3、與該類物件關聯的操作資訊,比如說tp_base等指向函式的指標;
4、型別物件的型別資訊。
重點1、物件的建立:
python建立物件主要有兩種方法,python c api和pyint_type。
python c api讓使用者從c環境與python互動,一共有兩種api,一種是aol(abstract object layer)即泛型api,另一種是col(concrete object layer)即型別api;aol都有pyobject_***的形式,可以應用到任何python物件上,表示式一般表示為:pyobject* intobj = pyobject_new(pyobject,&pyint_type),而col的api一般如下:pyobject* intobj = pyint_fromlong(1000);我們就建立了乙個1000整數物件。
無論採用哪種python c api,python都是最終直接分配記憶體,因為這都是python的內建物件,而如果我們自己定義了乙個類如:class myself(object),對於型別myself,python不會使用api來建立,但是python會通過myself所對應的型別物件來建立例項物件,myself的型別物件是object,所有python會通過object來建立myself的例項化物件。我們執行如下**:
class a(object):
pass
a = a()
type(a)
a.__base__
結果如下:
實際上,python是先例項化object執行object的構造方法,然後再例項化a,這與python的底層實現有著密切的聯絡。任何乙個使用者自定義的python類,最終都有乙個共同的父類object,例項化時先例項化object類,一次向下,直到例項化使用者自定義的類。
screen shot 2014-06-14 at 下午12.01.15
物件的行為:
class myint(int):
def __getitem__(self,key):
return key+str(self)
a = myint(1)
b = myint(2)
print a+b
print a['key']
執行結果為:12
3key1
最後說一下型別物件的型別。物件的型別也是乙個物件,那麼這個物件的型別又是什麼呢?首先可以確定他也是乙個物件。我們稱之為型別的型別。這個十分、非常、很、very much重要,就是原始碼中的pytype_type結構體,這個在objects資料夾的typeobject.c檔案裡,源**如下:
pytypeobject pytype_type = ;
呵呵,這個看起來很複雜,pyint_type和pytype_type之間如何聯絡起來的?就是前面部落格中所說的引用計數器,乙個整數物件執行時如下圖所示:
screen shot 2014-06-14 at 下午1.32.09
Python原始碼學習 之bytecode
原始碼 py檔案 或 字串 位元組碼 可快取在 pyc 結果 pythonx.dll libpythonx.x.a pythonx.dll libpythonx.x.a py compilestring pyeval eval compile eval 中通過import使用到的.py檔案會自動編譯...
Python原始碼學習 之 Python直譯器
include 公有 標頭檔案 lib python編寫的模組 modules c實現的模組 objects 內建物件型別的實現 pc windows下構建python的工程檔案 pcbuild parser 直譯器的 parser tokenizer input handling python 直...
Python原始碼學習 之模組路徑
接前面python原始碼筆記之py initializeex,嘗試看看python中用到的一些path 這部分東西太亂了.具體見pc getpathp.c 和 modules getpath.c 中的注釋 乙個python程式要有執行,必須要能找到 py pyc pyo pyd so 等,如何找到這...