- Python進階編程:編寫更高效、優(yōu)雅的Python代碼
- 劉宇宙 謝東 劉艷
- 415字
- 2021-04-30 12:39:32
0.3.8 對象的行為
PyTypeObject中定義了大量的函數(shù)指針。這些函數(shù)指針可以視為類型對象中所定義的操作,這些操作直接決定著對象在運行時所表現(xiàn)出的行為,比如PyTypeObject中的tp_hash指明了該類型對象如何生成其hash值。
在PyTypeObject的源碼中,可以看到非常重要的3組操作族:PyNumberMethods*tp_as_number、PySequenceMethods*tp_as_sequence、PyMappingMethods*tp_as_mapping。
PyNumberMethods的源碼(Include/object.h)如下:
// Include/object.h typedef PyObject * (*binaryfunc)(PyObject *, PyObject *); typedef struct { binaryfunc nb_matrix_multiply; binaryfunc nb_inplace_matrix_multiply; ...... } PyNumberMethods;
PyNumberMethods定義了數(shù)值對象該支持的操作。數(shù)值對象如果是整數(shù)對象,那么它的類型對象PyLong_Type中的tp_as_number.nb_add就指定了其進行加法操作時的具體行為。
在以下源碼中,我們可以看出PyLong_Type中的tp_as_number指向的是long_as_number:
// Objects/longobject.c static PyNumberMethods long_as_number = { (binaryfunc)long_add, /*nb_add*/ (binaryfunc)long_sub, /*nb_subtract*/ (binaryfunc)long_mul, /*nb_multiply*/ ...... }; PyTypeObject PyLong_Type = { PyVarObject_HEAD_INIT(&PyType_Type, 0) "int", /* tp_name */ offsetof(PyLongObject, ob_digit), /* tp_basicsize */ sizeof(digit), /* tp_itemsize */ long_dealloc, /* tp_dealloc */ 0, /* tp_print */ 0, /* tp_getattr */ 0, /* tp_setattr */ 0, /* tp_reserved */ long_to_decimal_string, /* tp_repr */ &long_as_number, /* tp_as_number */ 0, /* tp_as_sequence */ 0, /* tp_as_mapping */ ...... };
PySequenceMethods和PyMappingMethods的分析與PyNumberMethods相同,分別定義了作為序列對象和關(guān)聯(lián)對象應該支持的行為。這兩種對象的典型例子是list和dict,大家可以自行查閱源碼。
一種類型可以同時定義3個函數(shù)族中的所有操作。換句話說,一個對象可以既表現(xiàn)出數(shù)值對象的特性,也可以表現(xiàn)出關(guān)聯(lián)對象的特性。
推薦閱讀
- 計算機網(wǎng)絡(luò)
- 自制編譯器
- MySQL 8 DBA基礎(chǔ)教程
- 網(wǎng)頁設(shè)計與制作教程(HTML+CSS+JavaScript)(第2版)
- FLL+WRO樂高機器人競賽教程:機械、巡線與PID
- Python數(shù)據(jù)分析從0到1
- 機器學習微積分一本通(Python版)
- C#程序設(shè)計基礎(chǔ)入門教程
- Scrapy網(wǎng)絡(luò)爬蟲實戰(zhàn)
- IBM DB2 9.7 Advanced Application Developer Cookbook
- Selenium Essentials
- Hands-On Data Visualization with Bokeh
- Python自動化開發(fā)實戰(zhàn)
- Java語言程序設(shè)計與實現(xiàn)(微課版)
- Instant AutoIt Scripting