《Python 源碼閱讀》之 類型Type


py一切皆對象:
那么Type也是個對象。對象類型叫PyTypeObject

demo

>>> a = 1
>>> a
1

>>> type(a)
<type 'int'> int類型

#等價的兩個
>>> type(int)      int類型的類型就是type
<type 'type'>
>>> type(type(a))   type(a)是int類型的類型就是type
<type 'type'>

#還是等價的兩個
>>> type(type(int))
<type 'type'>
>>> type(type(type(a)))
<type 'type'>

# 1. int 的 類型 是`type`
>>> type(int)
<type 'type'>
# 2. type 的類型 還是`type`, 對應上面說明第二點
>>> type(type(int))
<type 'type'>

1. 首先, 定義一種類型對象叫PyTypeObject

定義

typedef struct _typeobject {

  /* MARK: base, 注意, 是個變長對象*/
  PyObject_VAR_HEAD
  const char *tp_name; /* For printing, in format "<module>.<name>" */ //類型名
  Py_ssize_t tp_basicsize, tp_itemsize; /* For allocation */ // 創建該類型對象時分配的內存空間大小


  // 一堆方法定義, 函數和指針
  /* Methods to implement standard operations */
  printfunc tp_print;
  hashfunc tp_hash;

  /* Method suites for standard classes */
  PyNumberMethods *tp_as_number;   // 數值對象操作
  PySequenceMethods *tp_as_sequence; // 序列對象操作
  PyMappingMethods *tp_as_mapping; // 字典對象操作

  // 一堆屬性定義
  ....

} PyTypeObject;

說明

  • PyObject_VAR_HEAD 變長對象
  • const char *tp_name tp_name, 類型名字符串數組
  • 所有Type對象都是PyTypeObject的”實例”:
    • 比如int類型:PyType_Type/PyInt_Type

2. 然后, 用PyTypeObject初始化得到一個對象PyType_Type

定義

PyTypeObject PyType_Type = {
  PyVarObject_HEAD_INIT(&PyType_Type, 0)
  "type",                                     /* tp_name */
  sizeof(PyHeapTypeObject),                   /* tp_basicsize */
  sizeof(PyMemberDef),                        /* tp_itemsize */
  (destructor)type_dealloc,                   /* tp_dealloc */

  // type對象的方法和屬性初始化值
  .....

};

說明

  • tp_name
    類型名, 這里是”type”
  • PyVarObject_HEAD_INIT(&PyType_Type, 0)
    PyVarObject_HEAD_INIT, 這個方法在 Include/object.h中,
    等價於
    ob_refcnt = 1
    *ob_type = &PyType_Type
    ob_size = 0
    即, PyType_Type的類型是其本身!
    這里寫圖片描述

3. 再然后, 定義具體的類型, 這里以PyInt_Type為例子

定義

PyTypeObject PyInt_Type = {
  PyVarObject_HEAD_INIT(&PyType_Type, 0)
  "int",
  sizeof(PyIntObject),
  0,

  // int類型的相關方法和屬性值
  ....

  (hashfunc)int_hash,                         /* tp_hash */

};

說明

  • “int”
    PyInt_Type的類型名是int
  • PyVarObject_HEAD_INIT(&PyType_Type, 0)
    PyInt_Type的
    *ob_type = &PyType_Type
    這里寫圖片描述
使用
>>> type(1)
<type 'int'>
>>> type(type(1))
<type 'type'>

4. 最后, 生成一個整數對象int

定義

typedef struct {
    PyObject_HEAD
    long ob_ival;
} PyIntObject;

結構
這里寫圖片描述

  • PyIntObject為整數類型
  • 聲明一個整數后得到整數對象
  • 對象ob_type指向PyInt_type對象

=========================

總結:

  1. 一切都是對象 什么都是PyObject/PyVarObject對象
  2. PyType_Type / PyInt_Type / PyString_Type ….等
    這些是類型對象, 可以認為是同級, 都是PyTypeObject這種類型的實例!
  3. 雖然是同級,
    但是其他PyXXX_Type, 其類型指向 PyType_Type
    PyType_Type 的類型指向自己, 它是所有類型的類型
  4. PyTypeObject 是一個變長對象
  5. 每個object, 例如PyIntObject都屬於一種類型
    object初始化時進行關聯


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM