在 python 的世界中,一切皆物件。int
/list
/dict
/ … 都是物件,除此之外,函式、類本身也是物件,那麼,這些物件究竟是什麼呢?
注 : 要是看不懂, 直接跳轉到最後。
從結果看,python 中的物件是 c 語言中結構體在堆上申請的一片記憶體區域。而在具體實現上,這裡先簡單描述一下。
在 python 中,所有物件都共有一些特性,這些特性定義在pyobject
中。pyobject
定義在include/object.h
中:
#define pyobject_head \
_pyobject_head_extra \
py_ssize_t ob_refcnt; \
struct _typeobject *ob_type;
typedef struct _object pyobject;
簡化後即為:
typedef struct _object pyobject;
pyobject
定義的內容會出現在每個物件所佔記憶體的開始部分。
在 python 中,除了bool float
這樣的定長物件(一旦確定下來需要的記憶體,便不再有改動),還有另外一種物件:長度可變的物件。這種物件在 python 的實現中通過pyvarobject
結構體來表示:
#define pyobject_var_head \
pyobject_head \
py_ssize_t ob_size; /* number of items in variable part */
typedef struct pyvarobject;
由此,python 中所有物件在實現的時候,記憶體無非如下兩種情況:
定長物件 變長物件
+-----------+ +-----------+
| ob_refcnt | | ob_refcnt |
+-----------+ +-----------+
| ob_type | | ob_type |
+-----------+ +-----------+
| | | ob_size |
| | +-----------+
| other | | |
| | | other |
| | | |
+-----------+ +-----------+
在描述pyobject
的時候,提到了乙個_typeobject
結構體。那麼,它是幹什麼的呢?想象一下,乙個物件在建立的時候需要多少記憶體、這個物件的類名是什麼等等資訊,又是如何記錄和區分的呢?
_typeobject
(也就是pytypeobject
)可以被稱之為「指定物件型別的型別物件」,其定義如下:
typedef struct _typeobject pytypeobject;
可以理解為,pytypeobject 物件是 python 中物件導向理念中「類」這個概念的實現,這裡只是簡單介紹其定義中的部分內容:
再看一眼pytypeobject
的定義,可以發現在最開始也有乙個pyobject_var_head
,這意味著它也是乙個物件。那麼,pytypeobject
既然是指示型別的物件,那麼它的型別又是什麼呢?答案是pytype_type
:
pytypeobject pytype_type = ;
事實上,它就是 python 語言中的type
物件就是pytype_type
,它是所有class
的class
,在 python 中叫做metaclass
。其實,在實現中它的ob_type
指標又指向了自己本身,既是:
pytype_type
+-----------+<-------+
| ob_refcnt | |
+-----------+ |
| ob_size +--------+
+-----------+
| |
| other |
| |
+-----------+
簡單概述了 python 中的物件的最模糊的概念。 Python 萬物皆物件
所有的函式都有乙個內建的 doc 屬性,它會返回在函式源 中定義的 doc string sys 模組是乙個物件,它有乙個叫作 path 的屬性 等等。我們仍然在迴避問題的實質,究竟何謂物件?不同的程式語言以不同的方式定義 物件 某些語言中,它意味著所有 物件必須 有屬性和方法 另一些語言中,它意味...
萬物皆物件
math物件是js中的乙個內建物件,他提供了一些數學相關的屬性和方法。console.log math.pi console.log math.floor 2.999 2 console.log math.floor 2.9999 3console.log math.ceil 2.0001 3 co...
Python中萬物皆物件?的理解
在很多地方都看到有過這樣一句話,但是物件這個詞的理解依然停留在談朋友那個物件上 python中一切皆為物件,乙個物件的特徵也稱為屬性 attribute 它所具有的行為也稱為方法 method python中的物件包含三要素 id type value 其中id用來唯一標識乙個物件,type標識物件...