萬物皆物件,Python的物件概述(簡述)

2021-09-01 18:40:08 字數 2640 閱讀 2253

在 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,它是所有classclass,在 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標識物件...