python原始碼學習 之 物件建立和物件的行為

2021-08-27 19:01:53 字數 1892 閱讀 6317

在將物件的建立和行為之前,我們先來看一下型別物件,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 等,如何找到這...