Kiểu cấu trúc đối tượng¶
Có lẽ một trong những cấu trúc quan trọng nhất của hệ thống đối tượng Python là cấu trúc xác định một kiểu mới: cấu trúc PyTypeObject. Các đối tượng loại có thể được xử lý bằng cách sử dụng bất kỳ hàm PyObject_* hoặc PyType_* nào, nhưng không mang lại nhiều điều thú vị cho hầu hết các ứng dụng Python. Các đối tượng này là nền tảng cho cách các đối tượng hoạt động, vì vậy chúng rất quan trọng đối với chính trình thông dịch và đối với bất kỳ mô-đun mở rộng nào triển khai các kiểu mới.
Đối tượng loại khá lớn so với hầu hết các loại tiêu chuẩn. Lý do cho kích thước là vì mỗi đối tượng kiểu lưu trữ một số lượng lớn các giá trị, chủ yếu là các con trỏ hàm C, mỗi đối tượng thực hiện một phần nhỏ chức năng của kiểu. Các trường của đối tượng loại được xem xét chi tiết trong phần này. Các trường sẽ được mô tả theo thứ tự xuất hiện trong cấu trúc.
Ngoài phần tham khảo nhanh sau đây, phần Ví dụ còn cung cấp cái nhìn tổng quan về ý nghĩa và cách sử dụng PyTypeObject.
Tham khảo nhanh¶
"khe tp"¶
Khe cắm PyTypeObject [1] |
phương pháp/attrs đặc biệt |
Thông tin [2] |
||||
|---|---|---|---|---|---|---|
ồ |
T |
D |
TÔI |
|||
<R> |
const char * |
__tên__ |
X |
X |
||
X |
X |
X |
||||
X |
X |
|||||
X |
X |
X |
||||
X |
X |
|||||
__getattribute__, __getattr__ |
G |
|||||
__setattr__, __delattr__ |
G |
|||||
% |
||||||
__repr__ |
X |
X |
X |
|||
% |
||||||
% |
||||||
% |
||||||
__băm__ |
X |
G |
||||
__gọi__ |
X |
X |
||||
__str__ |
X |
X |
||||
__getattribute__, __getattr__ |
X |
X |
G |
|||
__setattr__, __delattr__ |
X |
X |
G |
|||
% |
||||||
dài không dấu |
X |
X |
? |
|||
const char * |
__doc__ |
X |
X |
|||
X |
G |
|||||
X |
G |
|||||
__lt__, __le__, __eq__, __ne__, __gt__, __ge__ |
X |
G |
||||
X |
? |
|||||
__iter__ |
X |
|||||
__Kế tiếp__ |
X |
|||||
|
X |
X |
||||
|
X |
|||||
|
X |
X |
||||
__căn cứ__ |
X |
|||||
|
__dict__ |
? |
||||
__lấy__ |
X |
|||||
__đặt__, __xóa__ |
X |
|||||
X |
? |
|||||
__init__ |
X |
X |
X |
|||
X |
? |
? |
||||
__mới__ |
X |
X |
? |
? |
||
X |
X |
? |
? |
|||
X |
X |
|||||
< |
|
__bases__ |
~ |
|||
< |
|
__mro__ |
~ |
|||
[ |
|
|||||
trống * |
__lớp con__ |
|||||
|
||||||
( |
||||||
int không dấu |
||||||
__del__ |
X |
|||||
ký tự không dấu |
||||||
khe phụ¶
Chỗ |
phương pháp đặc biệt |
|
|---|---|---|
__chờ đợi__ |
||
__aiter__ |
||
__tiếp theo__ |
||
__add__ __radd__ |
||
__iadd__ |
||
__phụ__ __rsub__ |
||
__isub__ |
||
__mul__ __rmul__ |
||
__imul__ |
||
__mod__ __rmod__ |
||
__imod__ |
||
__divmod__ __rdivmod__ |
||
__pow__ __row__ |
||
__iow__ |
||
__tiêu cực__ |
||
__vị trí__ |
||
__abs__ |
||
__bool__ |
||
__đảo ngược__ |
||
__lshift__ __rlshift__ |
||
__ilshift__ |
||
__rshift__ __rrshift__ |
||
__irshift__ |
||
__và__ __rand__ |
||
__và__ |
||
__xor__ __rxor__ |
||
__ixor__ |
||
__hoặc__ __ror__ |
||
__ior__ |
||
__int__ |
||
trống * |
||
__trôi nổi__ |
||
__sàndiv__ |
||
__ifloordiv__ |
||
__truediv__ |
||
__itruediv__ |
||
__chỉ mục__ |
||
__matmul__ __rmatmul__ |
||
__imatmul__ |
||
__len__ |
||
__getitem__ |
||
__setitem__, __delitem__ |
||
__len__ |
||
__thêm vào__ |
||
__mul__ |
||
__getitem__ |
||
__setitem__ __delitem__ |
||
__chứa__ |
||
__iadd__ |
||
__imul__ |
||
__bộ đệm__ |
||
__release_bộ đệm__ |
||
khe typedefs¶
typedef |
Các loại tham số |
Kiểu trả về |
|---|---|---|
|
||
|
trống rỗng |
|
trống * |
trống rỗng |
|
int |
||
|
||
int |
||
|
|
|
PyObject *const char *
|
|
|
int |
||
|
||
int |
||
|
||
int |
||
|
Py_hash_t |
|
|
||
|
|
|
|
|
|
|
||
int |
||
trống rỗng |
||
|
int |
|
PyObject * |
|
|
|
||
|
||
|
||
int |
||
int |
||
int |
Xem Loại vị trí typedefs bên dưới để biết thêm chi tiết.
Định nghĩa đối tượng PyType¶
Định nghĩa cấu trúc cho PyTypeObject có thể được tìm thấy trong Include/cpython/object.h. Để thuận tiện cho việc tham khảo, điều này lặp lại định nghĩa được tìm thấy ở đó:
typedef cấu trúc _typeobject {
PyObject_VAR_HEAD
const char *tp_name; /* Để in, ở định dạng "<module>.<name>" */
Py_ssize_t tp_basicsize, tp_itemsize; /* Để phân bổ */
/* Các phương thức thực hiện các thao tác chuẩn */
hàm hủy tp_dealloc;
Py_ssize_t tp_vectorcall_offset;
getattrfunc tp_getattr;
setattrfunc tp_setattr;
PyAsyncMethods *tp_as_async; /* trước đây gọi là tp_compare (Python 2)
hoặc tp_reserved (Python 3) */
reprfunc tp_repr;
/* Bộ phương thức cho các lớp tiêu chuẩn */
Phương thức PyNumber *tp_as_number;
Phương thức PySequence *tp_as_sequence;
Phương thức PyMapping *tp_as_mapping;
/* Các thao tác tiêu chuẩn khác (ở đây để tương thích nhị phân) */
hashfunc tp_hash;
ternaryfunc tp_call;
reprfunc tp_str;
getattrofunc tp_getattro;
setattrofunc tp_setattro;
/* Hàm truy cập đối tượng dưới dạng bộ đệm đầu vào/đầu ra */
PyBufferProcs *tp_as_buffer;
/* Cờ để xác định sự hiện diện của các tính năng tùy chọn/mở rộng */
tp_flags dài không dấu;
const char *tp_doc; /* Chuỗi tài liệu */
/* Ý nghĩa được gán trong phiên bản 2.0 */
/*gọi hàm cho tất cả các đối tượng có thể truy cập được */
traverseproc tp_traverse;
/*xóa tham chiếu đến các đối tượng được chứa */
yêu cầu tp_clear;
/* Ý nghĩa được gán trong phiên bản 2.1 */
/* so sánh phong phú */
richcmpfunc tp_richcompare;
/* trình kích hoạt tham chiếu yếu */
Py_ssize_t tp_weaklistoffset;
/* Các vòng lặp */
getiterfunc tp_iter;
iternextfunc tp_iternext;
/* Bộ mô tả thuộc tính và nội dung phân lớp */
PyMethodDef *tp_methods;
PyMemberDef *tp_members;
PyGetSetDef *tp_getset;
// Tham chiếu mạnh trên kiểu heap, tham chiếu mượn trên kiểu tĩnh
PyTypeObject *tp_base;
PyObject *tp_dict;
giải mã tp_descr_get;
giải mã tp_descr_set;
Py_ssize_t tp_dictoffset;
initproc tp_init;
phân bổ tp_alloc;
newfunc tp_new;
freefunc tp_free; /* Thủ tục bộ nhớ trống cấp độ thấp */
yêu cầu tp_is_gc; /* Dành cho PyObject_IS_GC */
PyObject *tp_base;
Thứ tự phân giải phương thức PyObject *tp_mro; /* */
PyObject *tp_cache; /* không còn được sử dụng */
void *tp_subclasses; /* đối với các kiểu dựng sẵn tĩnh, đây là một chỉ mục */
PyObject *tp_weaklist; /* không được sử dụng cho các kiểu dựng sẵn tĩnh */
hàm hủy tp_del;
/* Nhập thẻ phiên bản bộ đệm thuộc tính. Đã thêm vào phiên bản 2.6.
* Nếu bằng 0, bộ đệm không hợp lệ và phải được khởi tạo.
*/
unsigned int tp_version_tag;
hàm hủy tp_finalize;
vectorcallfunc tp_vectorcall;
/* bitset mà người theo dõi kiểu quan tâm đến kiểu này */
ký tự không dấu tp_watched;
/* Số lượng giá trị tp_version_tag được sử dụng.
* Đặt thành _Py_ATTR_CACHE_UNUSED nếu bộ đệm thuộc tính là
* bị vô hiệu hóa đối với loại này (ví dụ: do các mục MRO tùy chỉnh).
* Mặt khác, giới hạn ở MAX_VERSIONS_PER_CLASS (được xác định ở nơi khác).
*/
uint16_t tp_versions_used;
} PyTypeObject;
Khe cắm PyObject¶
Cấu trúc đối tượng kiểu mở rộng cấu trúc PyVarObject. Trường ob_size được sử dụng cho các loại động (được tạo bởi type_new(), thường được gọi từ một câu lệnh lớp). Lưu ý rằng PyType_Type (siêu kiểu) khởi tạo tp_itemsize, có nghĩa là các phiên bản của nó (tức là loại đối tượng) must có trường ob_size.
Số tham chiếu của đối tượng loại được khởi tạo thành
1bởi macroPyObject_HEAD_INIT. Lưu ý rằng đối với statically allocated type objects, các phiên bản của loại (các đối tượng cóob_typetrỏ ngược lại loại) not được tính là tham chiếu. Nhưng đối với dynamically allocated type objects, các phiên bản do được tính là tham chiếu.Inheritance:
Trường này không được kế thừa bởi các kiểu con.
Đây là loại của loại, nói cách khác là siêu loại của nó. Nó được khởi tạo bằng đối số của macro
PyObject_HEAD_INITvà giá trị của nó thường là&PyType_Type. Tuy nhiên, đối với các mô-đun mở rộng có thể tải động và phải sử dụng được trên Windows (ít nhất), trình biên dịch sẽ phàn nàn rằng đây không phải là trình khởi tạo hợp lệ. Do đó, quy ước là chuyểnNULLcho macroPyObject_HEAD_INITvà khởi tạo trường này một cách rõ ràng khi bắt đầu chức năng khởi tạo của mô-đun, trước khi thực hiện bất kỳ điều gì khác. Điều này thường được thực hiện như thế này:Foo_Type.ob_type = &PyType_Type;Điều này nên được thực hiện trước khi bất kỳ phiên bản nào của loại này được tạo.
PyType_Ready()kiểm tra xemob_typecó phải làNULLhay không và nếu có, hãy khởi tạo nó ở trườngob_typecủa lớp cơ sở.PyType_Ready()sẽ không thay đổi trường này nếu nó khác 0.Inheritance:
Trường này được kế thừa bởi các kiểu con.
Khe cắm đối tượng PyVar¶
Đối với statically allocated type objects, giá trị này phải được khởi tạo bằng 0. Đối với dynamically allocated type objects, trường này có ý nghĩa nội tại đặc biệt.
Trường này phải được truy cập bằng macro
Py_SIZE().Inheritance:
Trường này không được kế thừa bởi các kiểu con.
Khe cắm đối tượng PyType¶
Mỗi slot có một phần mô tả tính kế thừa. Nếu PyType_Ready() có thể đặt giá trị khi trường được đặt thành NULL thì cũng sẽ có phần "Mặc định". (Lưu ý rằng nhiều trường được đặt trên PyBaseObject_Type và PyType_Type hoạt động như mặc định một cách hiệu quả.)
-
const char *PyTypeObject.tp_name¶
Con trỏ tới chuỗi kết thúc bằng NUL chứa tên của loại. Đối với các loại có thể truy cập được dưới dạng toàn cục mô-đun, chuỗi phải là tên mô-đun đầy đủ, theo sau là dấu chấm, theo sau là tên loại; đối với các loại tích hợp, nó chỉ là tên loại. Nếu mô-đun là mô-đun con của gói thì tên gói đầy đủ là một phần của tên mô-đun đầy đủ. Ví dụ: loại có tên
Tđược xác định trong mô-đunMtrong gói conQtrong góiPphải có trình khởi tạotp_name"P.Q.M.T".Đối với dynamically allocated type objects, đây chỉ là tên loại và tên mô-đun được lưu trữ rõ ràng trong lệnh loại làm giá trị cho khóa
'__module__'.Đối với statically allocated type objects, trường tp_name phải chứa dấu chấm. Mọi thứ trước dấu chấm cuối cùng đều có thể truy cập được dưới dạng thuộc tính
__module__và mọi thứ sau dấu chấm cuối cùng đều có thể truy cập được dưới dạng thuộc tính__name__.Nếu không có dấu chấm, toàn bộ trường
tp_namesẽ có thể truy cập được dưới dạng thuộc tính__name__và thuộc tính__module__không được xác định (trừ khi được đặt rõ ràng trong từ điển, như đã giải thích ở trên). Điều này có nghĩa là loại của bạn sẽ không thể ngâm được. Ngoài ra, nó sẽ không được liệt kê trong tài liệu mô-đun được tạo bằng pydoc.Trường này không được là
NULL. Đây là trường bắt buộc duy nhất trongPyTypeObject()(ngoài trường có khả năng làtp_itemsize).Inheritance:
Trường này không được kế thừa bởi các kiểu con.
-
Py_ssize_t PyTypeObject.tp_basicsize¶
-
Py_ssize_t PyTypeObject.tp_itemsize¶
Các trường này cho phép tính toán kích thước tính bằng byte của các thể hiện của loại.
Có hai loại loại: loại có phiên bản có độ dài cố định có trường
tp_itemsizebằng 0, loại có phiên bản có độ dài thay đổi có trườngtp_itemsizekhác 0. Đối với loại có phiên bản có độ dài cố định, tất cả phiên bản đều có cùng kích thước, được tính bằngtp_basicsize. (Các ngoại lệ cho quy tắc này có thể được thực hiện bằngPyUnstable_Object_GC_NewWithExtraData().)Đối với loại có phiên bản có độ dài thay đổi, phiên bản phải có trường
ob_sizevà kích thước phiên bản làtp_basicsizecộng với N lầntp_itemsize, trong đó N là "độ dài" của đối tượng.Các hàm như
PyObject_NewVar()sẽ lấy giá trị của N làm đối số và lưu trữ trong trườngob_sizecủa phiên bản. Lưu ý rằng trườngob_sizesau này có thể được sử dụng cho các mục đích khác. Ví dụ: các phiên bảnintsử dụng các bit củaob_sizetheo cách được xác định khi triển khai; bộ nhớ cơ bản và kích thước của nó phải được truy cập bằngPyLong_Export().Ghi chú
Trường
ob_sizephải được truy cập bằng macroPy_SIZE()vàPy_SET_SIZE().Ngoài ra, sự hiện diện của trường
ob_sizetrong bố cục phiên bản không có nghĩa là cấu trúc phiên bản có độ dài thay đổi. Ví dụ: loạilistcó các phiên bản có độ dài cố định, tuy nhiên các phiên bản đó có trườngob_size. (Giống nhưint, tránh đọc trực tiếp danh sách'ob_size. Thay vào đó hãy gọiPyList_Size().)tp_basicsizebao gồm kích thước cần thiết cho dữ liệu thuộc loạitp_base, cộng với mọi dữ liệu bổ sung cần thiết cho mỗi phiên bản.Cách chính xác để đặt
tp_basicsizelà sử dụng toán tửsizeoftrên cấu trúc được sử dụng để khai báo bố cục cá thể. Cấu trúc này phải bao gồm cấu trúc được sử dụng để khai báo kiểu cơ sở. Nói cách khác,tp_basicsizephải lớn hơn hoặc bằngtp_basicsizecủa cơ số.Vì mỗi loại là một kiểu con của
objectnên cấu trúc này phải bao gồmPyObjecthoặcPyVarObject(tùy thuộc vào việc có nên đưa vàoob_sizehay không). Chúng thường được xác định bởi macroPyObject_HEADhoặcPyObject_VAR_HEADtương ứng.Kích thước cơ bản không bao gồm kích thước tiêu đề GC vì tiêu đề đó không phải là một phần của
PyObject_HEAD.Đối với trường hợp cấu trúc được sử dụng để khai báo loại cơ sở không xác định, hãy xem
PyType_Spec.basicsizevàPyType_FromMetaclass().Lưu ý về căn chỉnh:
tp_basicsizephải là bội số của_Alignof(PyObject). Khi sử dụngsizeoftrênstructbao gồmPyObject_HEAD, như được khuyến nghị, trình biên dịch sẽ đảm bảo điều này. Khi không sử dụng Cstructhoặc khi sử dụng các phần mở rộng của trình biên dịch như__attribute__((packed)), điều đó tùy thuộc vào bạn.Nếu các mục biến yêu cầu một sự căn chỉnh cụ thể thì mỗi mục
tp_basicsizevàtp_itemsizephải là bội số của sự căn chỉnh đó. Ví dụ: nếu phần biến của một loại lưu trữdouble, thì trách nhiệm của bạn là cả hai trường đều là bội số của_Alignof(double).
Inheritance:
Các trường này được kế thừa riêng biệt theo kiểu con. (Nghĩa là, nếu trường được đặt thành 0,
PyType_Ready()sẽ sao chép giá trị từ loại cơ sở, cho biết rằng các phiên bản không cần bộ nhớ bổ sung.)Nếu loại cơ sở có
tp_itemsizekhác 0 thì việc đặttp_itemsizethành một giá trị khác 0 trong một loại phụ thường không an toàn (mặc dù điều này phụ thuộc vào việc triển khai loại cơ sở).
-
destructor PyTypeObject.tp_dealloc¶
The corresponding slot ID
Py_tp_deallocis part of the ABI ổn định.Một con trỏ tới hàm hủy phiên bản. Chữ ký hàm là:
void tp_dealloc(PyObject *self);
Hàm hủy sẽ xóa tất cả các tham chiếu mà phiên bản sở hữu (ví dụ: gọi
Py_CLEAR()), giải phóng tất cả bộ đệm mà phiên bản đó sở hữu và gọi hàmtp_freecủa loại để giải phóng chính đối tượng đó.Nếu bạn có thể gọi các hàm có thể đặt chỉ báo lỗi, bạn phải sử dụng
PyErr_GetRaisedException()vàPyErr_SetRaisedException()để đảm bảo bạn không chặn chỉ báo lỗi có sẵn (việc xử lý có thể đã xảy ra trong khi xử lý một lỗi khác):khoảng trống tĩnh foo_dealloc(foo_object *self) { PyObject *et, *ev, *etb; PyObject *exc = PyErr_GetRaisedException(); ... PyErr_SetRaisedException(exc); }
Bản thân trình xử lý dealloc không được đưa ra ngoại lệ; nếu gặp trường hợp lỗi, nó sẽ gọi
PyErr_FormatUnraisable()để ghi lại (và xóa) một ngoại lệ không thể xử lý được.Không có đảm bảo nào được đưa ra khi một đối tượng bị phá hủy, ngoại trừ:
Python sẽ hủy một đối tượng ngay lập tức hoặc một thời gian sau khi tham chiếu cuối cùng đến đối tượng bị xóa, trừ khi bộ hoàn thiện của nó (
tp_finalize) sau đó phục hồi đối tượng.Một đối tượng sẽ không bị hủy trong khi nó đang được tự động hoàn thiện (
tp_finalize) hoặc tự động xóa (tp_clear).
CPython hiện phá hủy một đối tượng ngay lập tức khỏi
Py_DECREF()khi số lượng tham chiếu mới bằng 0, nhưng điều này có thể thay đổi trong phiên bản tương lai.Bạn nên gọi
PyObject_CallFinalizerFromDealloc()khi bắt đầutp_deallocđể đảm bảo rằng đối tượng luôn được hoàn thiện trước khi hủy.Nếu loại hỗ trợ thu gom rác (cờ
Py_TPFLAGS_HAVE_GCđược đặt), hàm hủy sẽ gọiPyObject_GC_UnTrack()trước khi xóa bất kỳ trường thành viên nào.Được phép gọi
tp_cleartừtp_deallocđể giảm trùng lặp mã và đảm bảo rằng đối tượng luôn bị xóa trước khi hủy. Hãy lưu ý rằngtp_clearcó thể đã được gọi.Nếu loại được phân bổ heap (
Py_TPFLAGS_HEAPTYPE), bộ giải phóng sẽ giải phóng tham chiếu được sở hữu cho đối tượng loại của nó (thông quaPy_DECREF()) sau khi gọi bộ giải phóng loại. Xem mã ví dụ bên dưới.:khoảng trống tĩnh foo_dealloc(PyObject *op) { foo_object *self = (foo_object *) op; PyObject_GC_UnTrack(tự); Py_CLEAR(tự->ref); Py_TYPE(tự)->tp_free(tự); }
tp_deallocphải giữ nguyên trạng thái ngoại lệ. Nếu nó cần gọi một cái gì đó có thể tạo ra một ngoại lệ, thì trạng thái ngoại lệ phải được sao lưu trước và khôi phục sau (sau khi ghi lại bất kỳ ngoại lệ nào bằngPyErr_WriteUnraisable()).Ví dụ:
khoảng trống tĩnh foo_dealloc(PyObject *self) { PyObject *exc = PyErr_GetRaisedException(); if (PyObject_CallFinalizerFromDealloc(self) < 0) { // bản thân đã được hồi sinh. phải làm xong; } PyTypeObject *tp = Py_TYPE(self); if (tp->tp_flags & Py_TPFLAGS_HAVE_GC) { PyObject_GC_UnTrack(tự); } // Tùy chọn nhưng thuận tiện để tránh trùng lặp mã. if (tp->tp_clear && tp->tp_clear(self) < 0) { PyErr_WriteUnraiseable(self); } // Mọi sự phá hủy bổ sung sẽ được thực hiện tại đây. tp->tp_free(tự); tự = NULL; // Trong trường hợp PyErr_WriteUnraisable() được gọi bên dưới. if (tp->tp_flags & Py_TPFLAGS_HEAPTYPE) { Py_CLEAR(tp); } xong: // Tùy chọn, nếu một cái gì đó được gọi có thể gây ra // ngoại lệ. nếu (PyErr_Occurred()) { PyErr_WriteUnraiseable(self); } PyErr_SetRaisedException(exc); }
tp_dealloccó thể được gọi từ bất kỳ luồng Python nào, không chỉ luồng đã tạo đối tượng (nếu đối tượng trở thành một phần của chu trình đếm lại, chu trình đó có thể được thu thập bởi bộ sưu tập rác trên bất kỳ luồng nào). Đây không phải là vấn đề đối với lệnh gọi API của Python, vì luồng màtp_deallocđược gọi bằng attached thread state. Tuy nhiên, nếu đối tượng bị hủy lần lượt phá hủy các đối tượng từ một số thư viện C khác, cần cẩn thận để đảm bảo rằng việc hủy các đối tượng đó trên luồng có têntp_deallocsẽ không vi phạm bất kỳ giả định nào của thư viện.Inheritance:
Trường này được kế thừa bởi các kiểu con.
Xem thêm
Vòng đời của đối tượng để biết chi tiết về mối liên hệ giữa vị trí này với các vị trí khác.
-
Py_ssize_t PyTypeObject.tp_vectorcall_offset¶
Một phần bù tùy chọn cho hàm theo từng phiên bản triển khai việc gọi đối tượng bằng cách sử dụng vectorcall protocol, một giải pháp thay thế hiệu quả hơn cho
tp_callđơn giản hơn.Trường này chỉ được sử dụng nếu cờ
Py_TPFLAGS_HAVE_VECTORCALLđược đặt. Nếu vậy, đây phải là số nguyên dương chứa phần bù trong thể hiện của con trỏvectorcallfunc.Con trỏ vectorcallfunc có thể là
NULL, trong trường hợp đó, phiên bản hoạt động như thểPy_TPFLAGS_HAVE_VECTORCALLchưa được đặt: việc gọi phiên bản sẽ quay lạitp_call.Bất kỳ lớp nào đặt
Py_TPFLAGS_HAVE_VECTORCALLcũng phải đặttp_callvà đảm bảo hành vi của nó nhất quán với hàm vectorcallfunc. Điều này có thể được thực hiện bằng cách đặt tp_call thànhPyVectorcall_Call().Thay đổi trong phiên bản 3.8: Trước phiên bản 3.8, slot này được đặt tên là
tp_print. Trong Python 2.x, nó được sử dụng để in thành tệp. Trong Python 3.0 đến 3.7, nó không được sử dụng.Thay đổi trong phiên bản 3.12: Trước phiên bản 3.12, mutable heap types không được khuyến nghị triển khai giao thức vectorcall. Khi người dùng đặt
__call__bằng mã Python, chỉ tp_call được cập nhật, điều này có thể khiến nó không nhất quán với hàm vectorcall. Kể từ phiên bản 3.12, cài đặt__call__sẽ vô hiệu hóa tối ưu hóa vectorcall bằng cách xóa cờPy_TPFLAGS_HAVE_VECTORCALL.Inheritance:
Trường này luôn được kế thừa. Tuy nhiên, cờ
Py_TPFLAGS_HAVE_VECTORCALLkhông phải lúc nào cũng được kế thừa. Nếu nó không được đặt thì lớp con sẽ không sử dụng vectorcall, ngoại trừ khiPyVectorcall_Call()được gọi rõ ràng.
-
getattrfunc PyTypeObject.tp_getattr¶
The corresponding slot ID
Py_tp_getattris part of the ABI ổn định.Một con trỏ tùy chọn tới hàm chuỗi thuộc tính get.
Trường này không còn được dùng nữa. Khi được xác định, nó sẽ trỏ đến một hàm hoạt động giống như hàm
tp_getattronhưng lấy chuỗi C thay vì đối tượng chuỗi Python để đặt tên thuộc tính.Inheritance:
Nhóm:
tp_getattr,tp_getattroTrường này được kế thừa bởi các kiểu con cùng với
tp_getattro: một kiểu con kế thừa cảtp_getattrvàtp_getattrotừ kiểu cơ sở của nó khitp_getattrvàtp_getattrocủa kiểu con đều làNULL.
-
setattrfunc PyTypeObject.tp_setattr¶
The corresponding slot ID
Py_tp_setattris part of the ABI ổn định.Một con trỏ tùy chọn tới hàm để thiết lập và xóa các thuộc tính.
Trường này không còn được dùng nữa. Khi được xác định, nó sẽ trỏ đến một hàm hoạt động giống như hàm
tp_setattronhưng lấy chuỗi C thay vì đối tượng chuỗi Python để đặt tên thuộc tính.Inheritance:
Nhóm:
tp_setattr,tp_setattroTrường này được kế thừa bởi các kiểu con cùng với
tp_setattro: một kiểu con kế thừa cảtp_setattrvàtp_setattrotừ kiểu cơ sở của nó khitp_setattrvàtp_setattrocủa kiểu con đều làNULL.
-
PyAsyncMethods *PyTypeObject.tp_as_async¶
Con trỏ tới một cấu trúc bổ sung chứa các trường chỉ liên quan đến các đối tượng triển khai giao thức awaitable và asynchronous iterator ở cấp độ C. Xem Cấu trúc đối tượng không đồng bộ để biết chi tiết.
Added in version 3.5: Trước đây được gọi là
tp_comparevàtp_reserved.Inheritance:
Trường
tp_as_asynckhông được kế thừa nhưng các trường chứa trong đó được kế thừa riêng lẻ.
-
reprfunc PyTypeObject.tp_repr¶
The corresponding slot ID
Py_tp_repris part of the ABI ổn định.Một con trỏ tùy chọn tới một hàm thực hiện hàm tích hợp
repr().Chữ ký giống như đối với
PyObject_Repr():PyObject *tp_repr(PyObject *self);
Hàm phải trả về một chuỗi hoặc một đối tượng Unicode. Lý tưởng nhất là hàm này sẽ trả về một chuỗi mà khi được truyền tới
eval(), trong một môi trường phù hợp, sẽ trả về một đối tượng có cùng giá trị. Nếu điều này không khả thi, nó sẽ trả về một chuỗi bắt đầu bằng'<'và kết thúc bằng'>'từ đó có thể suy ra cả loại và giá trị của đối tượng.Inheritance:
Trường này được kế thừa bởi các kiểu con.
Default:
Khi trường này không được đặt, một chuỗi có dạng
<%s object at %p>được trả về, trong đó%sđược thay thế bằng tên loại và%pbằng địa chỉ bộ nhớ của đối tượng.
-
PyNumberMethods *PyTypeObject.tp_as_number¶
Con trỏ tới một cấu trúc bổ sung chứa các trường chỉ liên quan đến các đối tượng thực hiện giao thức số. Các trường này được ghi lại trong Cấu trúc đối tượng số.
Inheritance:
Trường
tp_as_numberkhông được kế thừa nhưng các trường chứa trong đó được kế thừa riêng lẻ.
-
PySequenceMethods *PyTypeObject.tp_as_sequence¶
Con trỏ tới một cấu trúc bổ sung chứa các trường chỉ liên quan đến các đối tượng thực hiện giao thức tuần tự. Các trường này được ghi lại trong Cấu trúc đối tượng trình tự.
Inheritance:
Trường
tp_as_sequencekhông được kế thừa nhưng các trường chứa trong đó được kế thừa riêng lẻ.
-
PyMappingMethods *PyTypeObject.tp_as_mapping¶
Con trỏ tới một cấu trúc bổ sung chứa các trường chỉ liên quan đến các đối tượng thực hiện giao thức ánh xạ. Các trường này được ghi lại trong Ánh xạ cấu trúc đối tượng.
Inheritance:
Trường
tp_as_mappingkhông được kế thừa nhưng các trường chứa trong đó được kế thừa riêng lẻ.
-
hashfunc PyTypeObject.tp_hash¶
The corresponding slot ID
Py_tp_hashis part of the ABI ổn định.Một con trỏ tùy chọn tới một hàm thực hiện hàm tích hợp
hash().Chữ ký giống như đối với
PyObject_Hash():Py_hash_t tp_hash(PyObject *);
Giá trị
-1không được trả về dưới dạng giá trị trả về thông thường; khi xảy ra lỗi trong quá trình tính toán giá trị băm, hàm sẽ đặt ngoại lệ và trả về-1.Khi trường này không được đặt (and
tp_richcomparekhông được đặt), nỗ lực lấy hàm băm của đối tượng sẽ tăngTypeError. Điều này cũng giống như cài đặt nó thànhPyObject_HashNotImplemented().Trường này có thể được đặt rõ ràng thành
PyObject_HashNotImplemented()để chặn kế thừa phương thức băm từ kiểu cha. Điều này được hiểu là tương đương với__hash__ = Noneở cấp Python, khiếnisinstance(o, collections.Hashable)trả về chính xácFalse. Lưu ý rằng điều ngược lại cũng đúng - việc đặt__hash__ = Nonetrên một lớp ở cấp độ Python sẽ dẫn đến vị trítp_hashđược đặt thànhPyObject_HashNotImplemented().Inheritance:
Nhóm:
tp_hash,tp_richcompareTrường này được kế thừa bởi các kiểu con cùng với
tp_richcompare: một kiểu con kế thừa cảtp_richcomparevàtp_hash, khitp_richcomparevàtp_hashcủa kiểu con đó đều làNULL.Default:
PyBaseObject_Typesử dụngPyObject_GenericHash().
-
ternaryfunc PyTypeObject.tp_call¶
The corresponding slot ID
Py_tp_callis part of the ABI ổn định.Một con trỏ tùy chọn tới một hàm thực hiện việc gọi đối tượng. Đây phải là
NULLnếu đối tượng không thể gọi được. Chữ ký giống như đối vớiPyObject_Call():PyObject *tp_call(PyObject *self, PyObject *args, PyObject *kwargs);
Inheritance:
Trường này được kế thừa bởi các kiểu con.
-
reprfunc PyTypeObject.tp_str¶
The corresponding slot ID
Py_tp_stris part of the ABI ổn định.Một con trỏ tùy chọn tới một hàm thực hiện thao tác tích hợp
str(). (Lưu ý rằngstrhiện là một loại vàstr()gọi hàm tạo cho loại đó. Hàm tạo này gọiPyObject_Str()để thực hiện công việc thực tế vàPyObject_Str()sẽ gọi trình xử lý này.)Chữ ký giống như đối với
PyObject_Str():PyObject *tp_str(PyObject *self);
Hàm phải trả về một chuỗi hoặc một đối tượng Unicode. Nó phải là một biểu diễn chuỗi "thân thiện" của đối tượng, vì đây là biểu diễn sẽ được sử dụng, cùng với những thứ khác, bởi hàm
print().Inheritance:
Trường này được kế thừa bởi các kiểu con.
Default:
Khi trường này không được đặt,
PyObject_Repr()được gọi để trả về biểu diễn chuỗi.
-
getattrofunc PyTypeObject.tp_getattro¶
The corresponding slot ID
Py_tp_getattrois part of the ABI ổn định.Một con trỏ tùy chọn tới hàm get-attribute.
Chữ ký giống như đối với
PyObject_GetAttr():PyObject *tp_getattro(PyObject *self, PyObject *attr);
Thông thường sẽ thuận tiện nếu đặt trường này thành
PyObject_GenericGetAttr(), trường này thực hiện cách tìm kiếm thuộc tính đối tượng thông thường.Inheritance:
Nhóm:
tp_getattr,tp_getattroTrường này được kế thừa bởi các kiểu con cùng với
tp_getattr: một kiểu con kế thừa cảtp_getattrvàtp_getattrotừ kiểu cơ sở của nó khitp_getattrvàtp_getattrocủa kiểu con đều làNULL.Default:
-
setattrofunc PyTypeObject.tp_setattro¶
The corresponding slot ID
Py_tp_setattrois part of the ABI ổn định.Một con trỏ tùy chọn tới hàm để thiết lập và xóa các thuộc tính.
Chữ ký giống như đối với
PyObject_SetAttr():int tp_setattro(PyObject *self, PyObject *attr, giá trị PyObject *);
Ngoài ra, cài đặt value thành
NULLđể xóa thuộc tính phải được hỗ trợ. Thông thường, sẽ thuận tiện hơn khi đặt trường này thànhPyObject_GenericSetAttr(), cách này thực hiện cách thiết lập thuộc tính đối tượng thông thường.Inheritance:
Nhóm:
tp_setattr,tp_setattroTrường này được kế thừa bởi các kiểu con cùng với
tp_setattr: một kiểu con kế thừa cảtp_setattrvàtp_setattrotừ kiểu cơ sở của nó khitp_setattrvàtp_setattrocủa kiểu con đều làNULL.Default:
-
PyBufferProcs *PyTypeObject.tp_as_buffer¶
Con trỏ tới một cấu trúc bổ sung chứa các trường chỉ liên quan đến các đối tượng triển khai giao diện bộ đệm. Các trường này được ghi lại trong Cấu trúc đối tượng đệm.
Inheritance:
Trường
tp_as_bufferkhông được kế thừa nhưng các trường chứa trong đó được kế thừa riêng lẻ.
-
unsigned long PyTypeObject.tp_flags¶
Trường này là một mặt nạ bit của các cờ khác nhau. Một số cờ biểu thị ngữ nghĩa biến thể cho các tình huống nhất định; những trường khác được sử dụng để chỉ ra rằng các trường nhất định trong đối tượng loại (hoặc trong cấu trúc mở rộng được tham chiếu qua
tp_as_number,tp_as_sequence,tp_as_mappingvàtp_as_buffer) trước đây không phải lúc nào cũng hợp lệ; nếu bit cờ đó rõ ràng thì các trường loại mà nó bảo vệ sẽ không được truy cập và thay vào đó phải được coi là có giá trị 0 hoặcNULL.Inheritance:
Kế thừa của lĩnh vực này là phức tạp. Hầu hết các bit cờ được kế thừa riêng lẻ, tức là nếu loại cơ sở có tập hợp bit cờ thì kiểu con sẽ kế thừa bit cờ này. Các bit cờ liên quan đến cấu trúc mở rộng được kế thừa nghiêm ngặt nếu cấu trúc mở rộng được kế thừa, tức là giá trị của loại cơ sở của bit cờ được sao chép vào kiểu con cùng với một con trỏ tới cấu trúc mở rộng. Bit cờ
Py_TPFLAGS_HAVE_GCđược kế thừa cùng với các trườngtp_traversevàtp_clear, tức là nếu bit cờPy_TPFLAGS_HAVE_GCrõ ràng trong loại phụ và các trườngtp_traversevàtp_cleartrong loại phụ tồn tại và có các giá trịNULL.Default:
PyBaseObject_Typesử dụngPy_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE.Bit Masks:
Các mặt nạ bit sau đây hiện đã được xác định; những thứ này có thể được OR cùng nhau bằng cách sử dụng toán tử
|để tạo thành giá trị của trườngtp_flags. MacroPyType_HasFeature()nhận một loại và một giá trị cờ, tp và f, đồng thời kiểm tra xemtp->tp_flags & fcó khác 0 hay không.-
Py_TPFLAGS_HEAPTYPE¶
Bit này được đặt khi chính đối tượng loại được phân bổ trên heap, ví dụ: các loại được tạo động bằng
PyType_FromSpec(). Trong trường hợp này, trườngob_typecủa các phiên bản của nó được coi là tham chiếu đến loại và đối tượng loại được INCREF'ed khi một phiên bản mới được tạo và DECREF'ed khi một phiên bản bị hủy (điều này không áp dụng cho các phiên bản của kiểu con; chỉ loại được tham chiếu bởi ob_type của phiên bản mới nhận được INCREF'ed hoặc DECREF'ed). Các loại heap cũng nên support garbage collection vì chúng có thể tạo thành một chu trình tham chiếu với đối tượng mô-đun của riêng chúng.Inheritance:
???
-
Py_TPFLAGS_BASETYPE¶
- Một phần của ABI ổn định.
Bit này được đặt khi loại này có thể được sử dụng làm loại cơ sở của loại khác. Nếu bit này trống thì kiểu này không thể được phân kiểu phụ (tương tự như lớp "cuối cùng" trong Java).
Inheritance:
???
-
Py_TPFLAGS_READY¶
Bit này được thiết lập khi đối tượng loại đã được khởi tạo hoàn toàn bởi
PyType_Ready().Inheritance:
???
-
Py_TPFLAGS_READYING¶
Bit này được đặt trong khi
PyType_Ready()đang trong quá trình khởi tạo đối tượng loại.Inheritance:
???
-
Py_TPFLAGS_HAVE_GC¶
- Một phần của ABI ổn định.
Bit này được thiết lập khi đối tượng hỗ trợ thu gom rác. Nếu bit này được đặt, bộ nhớ cho các phiên bản mới (xem
tp_alloc) phải được phân bổ bằngPyObject_GC_NewhoặcPyType_GenericAlloc()và được giải phóng (xemtp_free) bằngPyObject_GC_Del(). Thông tin thêm trong phần Hỗ trợ thu gom rác tuần hoàn.Inheritance:
Nhóm:
Py_TPFLAGS_HAVE_GC,tp_traverse,tp_clearBit cờ
Py_TPFLAGS_HAVE_GCđược kế thừa cùng với các trườngtp_traversevàtp_clear, tức là nếu bit cờPy_TPFLAGS_HAVE_GCrõ ràng trong loại phụ và các trườngtp_traversevàtp_cleartrong loại phụ tồn tại và có các giá trịNULL.
-
Py_TPFLAGS_DEFAULT¶
- Một phần của ABI ổn định.
Đây là mặt nạ bit của tất cả các bit liên quan đến sự tồn tại của các trường nhất định trong đối tượng kiểu và cấu trúc mở rộng của nó. Hiện tại, nó bao gồm các bit sau:
Py_TPFLAGS_HAVE_STACKLESS_EXTENSION.Inheritance:
???
-
Py_TPFLAGS_METHOD_DESCRIPTOR¶
- Một phần của ABI ổn định kể từ phiên bản 3.8.
Bit này chỉ ra rằng các đối tượng hoạt động giống như các phương thức không liên kết.
Nếu cờ này được đặt cho
type(meth)thì:meth.__get__(obj, cls)(*args, **kwds)(vớiobjchứ không phải None) phải tương đương vớimeth(obj, *args, **kwds).meth.__get__(None, cls)(*args, **kwds)phải tương đương vớimeth(*args, **kwds).
Cờ này cho phép tối ưu hóa các lệnh gọi phương thức thông thường như
obj.meth(): nó tránh tạo đối tượng "phương thức ràng buộc" tạm thời choobj.meth.Added in version 3.8.
Inheritance:
Cờ này không bao giờ được kế thừa bởi các loại không có cờ
Py_TPFLAGS_IMMUTABLETYPEđược đặt. Đối với các loại tiện ích mở rộng, nó được kế thừa bất cứ khi nàotp_descr_getđược kế thừa.
-
Py_TPFLAGS_MANAGED_DICT¶
Bit này chỉ ra rằng các phiên bản của lớp có thuộc tính
__dict__và không gian dành cho từ điển được VM quản lý.Nếu cờ này được đặt,
Py_TPFLAGS_HAVE_GCcũng sẽ được đặt.Hàm duyệt kiểu phải gọi
PyObject_VisitManagedDict()và hàm rõ ràng của nó phải gọiPyObject_ClearManagedDict().Added in version 3.12.
Inheritance:
Cờ này được kế thừa trừ khi trường
tp_dictoffsetđược đặt trong siêu lớp.
-
Py_TPFLAGS_MANAGED_WEAKREF¶
Bit này chỉ ra rằng các thể hiện của lớp có thể được tham chiếu yếu.
Added in version 3.12.
Inheritance:
Cờ này được kế thừa trừ khi trường
tp_weaklistoffsetđược đặt trong siêu lớp.
-
Py_TPFLAGS_ITEMS_AT_END¶
- Một phần của ABI ổn định kể từ phiên bản 3.12.
Chỉ có thể sử dụng được với các loại có kích thước thay đổi, tức là các loại có
tp_itemsizekhác 0.Cho biết rằng phần có kích thước thay đổi của một phiên bản thuộc loại này nằm ở cuối vùng bộ nhớ của phiên bản đó, ở độ lệch
Py_TYPE(obj)->tp_basicsize(có thể khác nhau ở mỗi lớp con).Khi đặt cờ này, hãy đảm bảo rằng tất cả các siêu lớp đều sử dụng bố cục bộ nhớ này hoặc không có kích thước thay đổi. Python không kiểm tra điều này.
Added in version 3.12.
Inheritance:
Cờ này được kế thừa.
-
Py_TPFLAGS_LONG_SUBCLASS¶
-
Py_TPFLAGS_LIST_SUBCLASS¶
-
Py_TPFLAGS_TUPLE_SUBCLASS¶
-
Py_TPFLAGS_BYTES_SUBCLASS¶
-
Py_TPFLAGS_UNICODE_SUBCLASS¶
-
Py_TPFLAGS_DICT_SUBCLASS¶
-
Py_TPFLAGS_BASE_EXC_SUBCLASS¶
-
Py_TPFLAGS_TYPE_SUBCLASS¶
Các hàm như
PyLong_Check()sẽ gọiPyType_FastSubclass()bằng một trong các cờ này để nhanh chóng xác định xem một loại có phải là lớp con của loại tích hợp hay không; kiểm tra cụ thể như vậy nhanh hơn kiểm tra chung, nhưPyObject_IsInstance(). Các loại tùy chỉnh kế thừa từ các phần dựng sẵn phải được đặttp_flagsphù hợp hoặc mã tương tác với các loại đó sẽ hoạt động khác nhau tùy thuộc vào loại kiểm tra nào được sử dụng.
-
Py_TPFLAGS_HAVE_FINALIZE¶
Bit này được đặt khi có khe
tp_finalizetrong cấu trúc kiểu.Added in version 3.4.
Sắp loại bỏ từ phiên bản 3.8: Cờ này không cần thiết nữa vì trình thông dịch giả định rằng khe
tp_finalizeluôn hiện diện trong cấu trúc kiểu.
-
Py_TPFLAGS_HAVE_VECTORCALL¶
- Một phần của ABI ổn định kể từ phiên bản 3.12.
Bit này được thiết lập khi lớp triển khai vectorcall protocol. Xem
tp_vectorcall_offsetđể biết chi tiết.Inheritance:
Bit này được kế thừa nếu
tp_callcũng được kế thừa.Added in version 3.8: như
_Py_TPFLAGS_HAVE_VECTORCALLThay đổi trong phiên bản 3.9.
Đã đổi tên thành tên hiện tại, không có dấu gạch dưới ở đầu. Tên tạm thời cũ là soft deprecated.
Thay đổi trong phiên bản 3.12: Cờ này hiện đã bị xóa khỏi một lớp khi phương thức
__call__()của lớp đó được gán lại.Cờ này bây giờ có thể được kế thừa bởi các lớp có thể thay đổi.
-
Py_TPFLAGS_IMMUTABLETYPE¶
Bit này được đặt cho các đối tượng loại không thể thay đổi: thuộc tính loại không thể được đặt cũng như không thể xóa.
PyType_Ready()tự động áp dụng cờ này cho static types.Inheritance:
Cờ này không được kế thừa.
Added in version 3.10.
-
Py_TPFLAGS_DISALLOW_INSTANTIATION¶
Không cho phép tạo các phiên bản của loại: đặt
tp_newthành NULL và không tạo khóa__new__trong từ điển loại.Cờ phải được đặt trước khi tạo loại, không được đặt sau. Ví dụ: nó phải được đặt trước khi
PyType_Ready()được gọi trên loại.Cờ được đặt tự động trên static types nếu
tp_baselà NULL hoặc&PyBaseObject_Typevàtp_newlà NULL.Inheritance:
Cờ này không được kế thừa. Tuy nhiên, các lớp con sẽ không thể thực hiện được trừ khi chúng cung cấp một
tp_newkhông phải NULL (điều này chỉ có thể thực hiện được thông qua C API).Ghi chú
Để không cho phép khởi tạo trực tiếp một lớp nhưng cho phép khởi tạo các lớp con của nó (ví dụ: đối với abstract base class), không sử dụng cờ này. Thay vào đó, hãy tạo
tp_newchỉ thành công cho các lớp con.Added in version 3.10.
-
Py_TPFLAGS_MAPPING¶
Bit này chỉ ra rằng các thể hiện của lớp có thể khớp với các mẫu ánh xạ khi được sử dụng làm chủ đề của khối
match. Nó được tự động đặt khi đăng ký hoặc phân lớp concollections.abc.Mappingvà được hủy đặt khi đăng kýcollections.abc.Sequence.Ghi chú
Py_TPFLAGS_MAPPINGvàPy_TPFLAGS_SEQUENCEloại trừ lẫn nhau; đó là một lỗi khi bật cả hai cờ cùng một lúc.Inheritance:
Cờ này được kế thừa bởi các loại chưa được đặt
Py_TPFLAGS_SEQUENCE.Xem thêm
PEP 634 -- Khớp mẫu cấu trúc: Đặc điểm kỹ thuật
Added in version 3.10.
-
Py_TPFLAGS_SEQUENCE¶
Bit này chỉ ra rằng các phiên bản của lớp có thể khớp với các mẫu trình tự khi được sử dụng làm chủ đề của khối
match. Nó được tự động đặt khi đăng ký hoặc phân lớpcollections.abc.Sequencevà được hủy đặt khi đăng kýcollections.abc.Mapping.Ghi chú
Py_TPFLAGS_MAPPINGvàPy_TPFLAGS_SEQUENCEloại trừ lẫn nhau; đó là một lỗi khi bật cả hai cờ cùng một lúc.Inheritance:
Cờ này được kế thừa bởi các loại chưa được đặt
Py_TPFLAGS_MAPPING.Xem thêm
PEP 634 -- Khớp mẫu cấu trúc: Đặc điểm kỹ thuật
Added in version 3.10.
-
Py_TPFLAGS_VALID_VERSION_TAG¶
Nội bộ. Không đặt hoặc hủy đặt cờ này. Để chỉ ra rằng một lớp đã thay đổi, hãy gọi
PyType_Modified()Cảnh báo
Cờ này hiện diện trong các tệp tiêu đề nhưng không được sử dụng. Nó sẽ bị xóa trong phiên bản CPython trong tương lai
-
Py_TPFLAGS_HAVE_VERSION_TAG¶
Đây là macro soft deprecated không làm gì cả. Về mặt lịch sử, điều này cho thấy trường
tp_version_tagđã có sẵn và được khởi tạo.
-
Py_TPFLAGS_INLINE_VALUES¶
Bit này chỉ ra rằng các thể hiện thuộc loại này sẽ có một mảng "giá trị nội tuyến" (chứa các thuộc tính của đối tượng) được đặt ngay sau phần cuối của đối tượng.
Điều này yêu cầu
Py_TPFLAGS_HAVE_GCđược thiết lập.Inheritance:
Cờ này không được kế thừa.
Added in version 3.13.
-
Py_TPFLAGS_IS_ABSTRACT¶
Bit này chỉ ra rằng đây là một loại trừu tượng và do đó không thể khởi tạo được.
Inheritance:
Cờ này không được kế thừa.
Xem thêm
-
Py_TPFLAGS_HAVE_STACKLESS_EXTENSION¶
Nội bộ. Không đặt hoặc hủy đặt cờ này. Trong lịch sử, đây là cờ dành riêng để sử dụng trong Stackless Python.
Cảnh báo
Cờ này hiện diện trong các tệp tiêu đề nhưng không được sử dụng. Điều này có thể bị xóa trong phiên bản CPython trong tương lai.
-
Py_TPFLAGS_HEAPTYPE¶
-
const char *PyTypeObject.tp_doc¶
The corresponding slot ID
Py_tp_docis part of the ABI ổn định.Một con trỏ tùy chọn tới chuỗi C kết thúc bằng NUL cung cấp chuỗi tài liệu cho đối tượng loại này. Điều này được hiển thị dưới dạng thuộc tính
__doc__trên loại và các phiên bản của loại.Inheritance:
Trường này là not được kế thừa bởi các kiểu con.
-
traverseproc PyTypeObject.tp_traverse¶
The corresponding slot ID
Py_tp_traverseis part of the ABI ổn định.Một con trỏ tùy chọn tới hàm truyền tải dành cho trình thu gom rác. Điều này chỉ được sử dụng nếu bit cờ
Py_TPFLAGS_HAVE_GCđược đặt. Chữ ký là:int tp_traverse(PyObject *self, visitproc visit, void *arg);
Bạn có thể tìm thêm thông tin về sơ đồ thu gom rác của Python trong phần Hỗ trợ thu gom rác tuần hoàn.
Con trỏ
tp_traverseđược trình thu gom rác sử dụng để phát hiện các chu kỳ tham chiếu. Cách triển khai điển hình của hàmtp_traversechỉ cần gọiPy_VISIT()trên mỗi thành viên của phiên bản là các đối tượng Python mà phiên bản đó sở hữu. Ví dụ: đây là hàmlocal_traverse()từ mô-đun mở rộng_threadint tĩnh local_traverse(PyObject *op, visitproc visit, void *arg) { localobject *self = (localobject *) op; Py_VISIT(tự->args); Py_VISIT(tự->kw); Py_VISIT(tự->dict); trả về 0; }
Lưu ý rằng
Py_VISIT()chỉ được gọi đối với những thành viên có thể tham gia vào chu trình tham chiếu. Mặc dù cũng có thành viênself->keynhưng nó chỉ có thể làNULLhoặc chuỗi Python và do đó không thể là một phần của chu trình tham chiếu.Mặt khác, ngay cả khi bạn biết một thành viên không bao giờ có thể là một phần của một chu trình, thì với tư cách là một công cụ hỗ trợ gỡ lỗi, bạn vẫn có thể muốn truy cập nó chỉ để chức năng
get_referents()của mô-đungcsẽ bao gồm nó.Các loại heap (
Py_TPFLAGS_HEAPTYPE) phải truy cập loại của chúng bằng:Py_VISIT(Py_TYPE(tự));
Nó chỉ cần thiết kể từ Python 3.9. Để hỗ trợ Python 3.8 trở lên, dòng này phải có điều kiện:
#if PY_VERSION_HEX >= 0x03090000 Py_VISIT(Py_TYPE(tự)); #endif
Nếu bit
Py_TPFLAGS_MANAGED_DICTđược đặt trong trườngtp_flags, hàm duyệt phải gọiPyObject_VisitManagedDict()như thế này:PyObject_VisitQuản lýDict((PyObject*)self, truy cập, arg);
Cảnh báo
Khi triển khai
tp_traverse, chỉ các thành viên có phiên bản owns (có strong references đối với họ) mới phải được truy cập. Ví dụ: nếu một đối tượng hỗ trợ các tham chiếu yếu thông qua khetp_weaklist, con trỏ hỗ trợ danh sách được liên kết (cái mà tp_weaklist trỏ đến) phải được truy cập not vì phiên bản không sở hữu trực tiếp các tham chiếu yếu cho chính nó (danh sách tham chiếu yếu có ở đó để hỗ trợ bộ máy tham chiếu yếu, nhưng phiên bản không có tham chiếu mạnh đến các phần tử bên trong nó, vì chúng được phép xóa ngay cả khi phiên bản vẫn còn hoạt động).Cảnh báo
Chức năng truyền tải không được có bất kỳ tác dụng phụ nào. Nó không được sửa đổi số lượng tham chiếu của bất kỳ đối tượng Python nào cũng như không được tạo hoặc hủy bất kỳ đối tượng Python nào.
Lưu ý rằng
Py_VISIT()yêu cầu các tham số visit và arg cholocal_traverse()để có các tên cụ thể này; đừng đặt tên cho họ bất cứ điều gì.Các phiên bản của heap-allocated types giữ một tham chiếu đến loại của chúng. Do đó, hàm truyền tải của chúng phải truy cập
Py_TYPE(self)hoặc ủy thác trách nhiệm này bằng cách gọitp_traversethuộc loại được phân bổ heap khác (chẳng hạn như siêu lớp được phân bổ heap). Nếu không, đối tượng loại có thể không được thu gom rác.Ghi chú
Hàm
tp_traversecó thể được gọi từ bất kỳ luồng nào.Thay đổi trong phiên bản 3.9: Các loại được phân bổ heap dự kiến sẽ truy cập
Py_TYPE(self)trongtp_traverse. Trong các phiên bản Python trước đó, do bug 40217, việc làm này có thể dẫn đến sự cố trong các lớp con.Inheritance:
Nhóm:
Py_TPFLAGS_HAVE_GC,tp_traverse,tp_clearTrường này được kế thừa bởi các kiểu con cùng với
tp_clearvà bit cờPy_TPFLAGS_HAVE_GC: bit cờ,tp_traversevàtp_clearđều được kế thừa từ kiểu cơ sở nếu chúng đều bằng 0 trong kiểu con.
-
inquiry PyTypeObject.tp_clear¶
The corresponding slot ID
Py_tp_clearis part of the ABI ổn định.Một con trỏ tùy chọn tới một hàm rõ ràng. Chữ ký là:
int tp_clear(PyObject *);
Mục đích của chức năng này là phá vỡ các chu kỳ tham chiếu đang gây ra cyclic isolate để các đối tượng có thể bị phá hủy một cách an toàn. Đối tượng bị xóa là đối tượng bị phá hủy một phần; đối tượng không bắt buộc phải đáp ứng các bất biến thiết kế được giữ trong quá trình sử dụng bình thường.
tp_clearkhông cần xóa các tham chiếu đến các đối tượng không thể tham gia vào chu trình tham chiếu, chẳng hạn như chuỗi Python hoặc số nguyên Python. Tuy nhiên, có thể thuận tiện khi xóa tất cả các tham chiếu và viết hàmtp_dealloccủa loại để gọitp_clearnhằm tránh trùng lặp mã. (Lưu ý rằngtp_clearcó thể đã được gọi. Thích gọi các hàm bình thường nhưPy_CLEAR().)Bất kỳ việc dọn dẹp không tầm thường nào cũng phải được thực hiện trong
tp_finalizethay vìtp_clear.Ghi chú
Nếu
tp_clearkhông phá vỡ được chu trình tham chiếu thì các đối tượng trong cyclic isolate có thể vẫn không thể thu thập được ("rò rỉ"). Xemgc.garbage.Ghi chú
Người giới thiệu (trực tiếp và gián tiếp) có thể đã bị xóa; chúng không được đảm bảo ở trạng thái nhất quán.
Ghi chú
Hàm
tp_clearcó thể được gọi từ bất kỳ luồng nào.Ghi chú
Một đối tượng không được đảm bảo sẽ tự động bị xóa trước khi hàm hủy của nó (
tp_dealloc) được gọi.Hàm này khác với hàm hủy (
tp_dealloc) ở những điểm sau:Mục đích của việc xóa một đối tượng là xóa các tham chiếu đến các đối tượng khác có thể tham gia vào chu trình tham chiếu. Mặt khác, mục đích của hàm hủy là một siêu tập hợp: nó phải giải phóng tài nguyên all mà nó sở hữu, bao gồm các tham chiếu đến các đối tượng không thể tham gia vào chu trình tham chiếu (ví dụ: số nguyên) cũng như bộ nhớ riêng của đối tượng (bằng cách gọi
tp_free).Khi
tp_clearđược gọi, các đối tượng khác vẫn có thể giữ các tham chiếu đến đối tượng đang bị xóa. Vì điều này,tp_clearkhông được giải phóng bộ nhớ riêng của đối tượng (tp_free). Mặt khác, hàm hủy chỉ được gọi khi không có tham chiếu (mạnh) nào tồn tại và do đó, phải phá hủy chính đối tượng đó một cách an toàn bằng cách giải phóng nó.tp_clearcó thể không bao giờ được gọi tự động. Mặt khác, hàm hủy của một đối tượng sẽ tự động được gọi một thời gian sau khi đối tượng không thể truy cập được (tức là không có tham chiếu đến đối tượng hoặc đối tượng là thành viên của cyclic isolate).
Không có đảm bảo nào được đưa ra về thời điểm, nếu hoặc tần suất Python tự động xóa một đối tượng, ngoại trừ:
Python sẽ không tự động xóa một đối tượng nếu nó có thể truy cập được, tức là có một tham chiếu đến nó và nó không phải là thành viên của cyclic isolate.
Python sẽ không tự động xóa một đối tượng nếu nó chưa được tự động hoàn thiện (xem
tp_finalize). (Nếu bộ hoàn thiện phục hồi đối tượng, đối tượng có thể được tự động hoàn thiện lại hoặc không trước khi bị xóa.)Nếu một đối tượng là thành viên của cyclic isolate, Python sẽ không tự động xóa nó nếu bất kỳ thành viên nào của vòng cách ly tuần hoàn chưa được tự động hoàn thiện (
tp_finalize).Python sẽ không hủy một đối tượng cho đến khi bất kỳ lệnh gọi tự động nào tới hàm
tp_clearcủa nó quay trở lại. Điều này đảm bảo rằng hành động phá vỡ chu trình tham chiếu không làm mất hiệu lực con trỏselftrong khitp_clearvẫn đang thực thi.Python sẽ không tự động gọi
tp_clearnhiều lần cùng một lúc.
CPython hiện chỉ tự động xóa các đối tượng khi cần thiết để phá vỡ chu kỳ tham chiếu trong cyclic isolate, nhưng các phiên bản trong tương lai có thể xóa các đối tượng thường xuyên trước khi chúng bị phá hủy.
Tổng hợp lại, tất cả các chức năng
tp_cleartrong hệ thống phải kết hợp lại để phá vỡ mọi chu kỳ tham chiếu. Điều này thật tinh tế và nếu có nghi ngờ gì, hãy cung cấp chức năngtp_clear. Ví dụ: loại bộ dữ liệu không triển khai hàmtp_clear, vì có thể chứng minh rằng không có chu trình tham chiếu nào có thể bao gồm toàn bộ bộ dữ liệu. Do đó, các hàmtp_clearthuộc các loại khác chịu trách nhiệm phá vỡ bất kỳ chu trình nào chứa một bộ dữ liệu. Điều này không rõ ràng ngay lập tức và hiếm khi có lý do chính đáng để tránh triển khaitp_clear.Việc triển khai
tp_clearsẽ loại bỏ các tham chiếu của phiên bản tới các tham chiếu của các thành viên có thể là đối tượng Python và đặt con trỏ của nó tới các thành viên đó thànhNULL, như trong ví dụ sau:int tĩnh local_clear(PyObject *op) { localobject *self = (localobject *) op; Py_CLEAR(tự->khóa); Py_CLEAR(self->args); Py_CLEAR(tự->kw); Py_CLEAR(tự->dict); trả về 0; }
Nên sử dụng macro
Py_CLEAR()vì việc xóa tham chiếu rất tinh vi: tham chiếu đến đối tượng được chứa không được giải phóng (thông quaPy_DECREF()) cho đến khi con trỏ tới đối tượng được chứa được đặt thànhNULL. Điều này là do việc giải phóng tham chiếu có thể khiến đối tượng được chứa trở thành thùng rác, kích hoạt một chuỗi hoạt động khôi phục có thể bao gồm việc gọi mã Python tùy ý (do các lệnh hoàn thiện hoặc lệnh gọi lại yếu, được liên kết với đối tượng được chứa). Nếu mã đó có thể tham chiếu lại self thì điều quan trọng là con trỏ tới đối tượng được chứa phải làNULLtại thời điểm đó, để self biết đối tượng được chứa không thể sử dụng được nữa. MacroPy_CLEAR()thực hiện các thao tác theo thứ tự an toàn.Nếu bit
Py_TPFLAGS_MANAGED_DICTđược đặt trong trườngtp_flags, hàm xóa phải gọiPyObject_ClearManagedDict()như thế nàyPyObject_ClearQuản lýDict((PyObject*)self);
Bạn có thể tìm thêm thông tin về sơ đồ thu gom rác của Python trong phần Hỗ trợ thu gom rác tuần hoàn.
Inheritance:
Nhóm:
Py_TPFLAGS_HAVE_GC,tp_traverse,tp_clearTrường này được kế thừa bởi các kiểu con cùng với
tp_traversevà bit cờPy_TPFLAGS_HAVE_GC: bit cờ,tp_traversevàtp_clearđều được kế thừa từ kiểu cơ sở nếu chúng đều bằng 0 trong kiểu con.Xem thêm
Vòng đời của đối tượng để biết chi tiết về mối liên hệ giữa vị trí này với các vị trí khác.
-
richcmpfunc PyTypeObject.tp_richcompare¶
The corresponding slot ID
Py_tp_richcompareis part of the ABI ổn định.Một con trỏ tùy chọn tới hàm so sánh phong phú, có chữ ký là:
PyObject *tp_richcompare(PyObject *self, PyObject *other, int op);
Tham số đầu tiên được đảm bảo là một phiên bản của loại được xác định bởi
PyTypeObject.Hàm sẽ trả về kết quả so sánh (thường là
Py_TruehoặcPy_False). Nếu so sánh không được xác định, nó phải trả vềPy_NotImplemented, nếu xảy ra lỗi khác, nó phải trả vềNULLvà đặt điều kiện ngoại lệ.Các hằng số sau đây được xác định để sử dụng làm đối số thứ ba cho
tp_richcomparevà choPyObject_RichCompare():Không thay đổi
So sánh
-
Py_LT¶
<-
Py_LE¶
<=-
Py_EQ¶
==-
Py_NE¶
!=-
Py_GT¶
>-
Py_GE¶
>=Macro sau được xác định để dễ dàng viết các hàm so sánh phong phú:
-
Py_RETURN_RICHCOMPARE(VAL_A, VAL_B, op)¶
Trả về
Py_TruehoặcPy_Falsetừ hàm, tùy thuộc vào kết quả so sánh. VAL_A và VAL_B phải được toán tử so sánh C sắp xếp theo thứ tự (ví dụ: chúng có thể là C int hoặc float). Đối số thứ ba chỉ định thao tác được yêu cầu, như đối vớiPyObject_RichCompare().Giá trị trả về là strong reference mới.
Nếu có lỗi, hãy đặt ngoại lệ và trả về
NULLtừ hàm.Added in version 3.7.
Inheritance:
Nhóm:
tp_hash,tp_richcompareTrường này được kế thừa bởi các kiểu con cùng với
tp_hash: một kiểu con kế thừatp_richcomparevàtp_hashkhitp_richcomparevàtp_hashcủa kiểu con đó đều làNULL.Default:
PyBaseObject_Typecung cấp triển khaitp_richcompare, có thể được kế thừa. Tuy nhiên, nếu chỉ xác địnhtp_hashthì ngay cả hàm kế thừa cũng không được sử dụng và các phiên bản của loại sẽ không thể tham gia vào bất kỳ so sánh nào.-
Py_LT¶
-
Py_ssize_t PyTypeObject.tp_weaklistoffset¶
Mặc dù trường này vẫn được hỗ trợ nhưng thay vào đó, bạn nên sử dụng
Py_TPFLAGS_MANAGED_WEAKREFnếu có thể.Nếu các phiên bản thuộc loại này có khả năng tham chiếu yếu thì trường này lớn hơn 0 và chứa phần bù trong cấu trúc phiên bản của phần đầu danh sách tham chiếu yếu (bỏ qua tiêu đề GC, nếu có); phần bù này được sử dụng bởi các hàm
PyObject_ClearWeakRefs()vàPyWeakref_*. Cấu trúc phiên bản cần bao gồm trường loại PyObject* được khởi tạo thànhNULL.Đừng nhầm lẫn trường này với
tp_weaklist; đó là đầu danh sách dành cho các tham chiếu yếu đến chính đối tượng kiểu đó.Sẽ có lỗi khi đặt cả bit
Py_TPFLAGS_MANAGED_WEAKREFvàtp_weaklistoffset.Inheritance:
Trường này được kế thừa bởi các kiểu con nhưng hãy xem các quy tắc được liệt kê bên dưới. Một kiểu con có thể ghi đè phần bù này; điều này có nghĩa là kiểu con sử dụng đầu danh sách tham chiếu yếu khác với kiểu cơ sở. Vì đầu danh sách luôn được tìm thấy qua
tp_weaklistoffsetnên đây không phải là vấn đề.Default:
Nếu bit
Py_TPFLAGS_MANAGED_WEAKREFđược đặt trong trườngtp_flagsthìtp_weaklistoffsetsẽ được đặt thành giá trị âm, để biểu thị rằng việc sử dụng trường này là không an toàn.
-
getiterfunc PyTypeObject.tp_iter¶
The corresponding slot ID
Py_tp_iteris part of the ABI ổn định.Một con trỏ tùy chọn tới một hàm trả về iterator cho đối tượng. Sự hiện diện của nó thường báo hiệu rằng các phiên bản thuộc loại này là iterable (mặc dù các chuỗi có thể lặp lại được nếu không có chức năng này).
Hàm này có cùng chữ ký với
PyObject_GetIter():PyObject *tp_iter(PyObject *self);
Inheritance:
Trường này được kế thừa bởi các kiểu con.
-
iternextfunc PyTypeObject.tp_iternext¶
The corresponding slot ID
Py_tp_iternextis part of the ABI ổn định.Một con trỏ tùy chọn tới một hàm trả về mục tiếp theo trong iterator. Chữ ký là:
PyObject *tp_iternext(PyObject *self);
Khi trình vòng lặp dùng hết, nó phải trả về
NULL; ngoại lệStopIterationcó thể được đặt hoặc không. Khi xảy ra lỗi khác, nó cũng phải trả vềNULL. Sự hiện diện của nó báo hiệu rằng các thể hiện của loại này là các trình vòng lặp.Các kiểu iterator cũng phải xác định hàm
tp_itervà hàm đó sẽ trả về chính phiên bản iterator (không phải một phiên bản iterator mới).Hàm này có chữ ký giống như
PyIter_Next().Inheritance:
Trường này được kế thừa bởi các kiểu con.
-
struct PyMethodDef *PyTypeObject.tp_methods¶
The corresponding slot ID
Py_tp_methodsis part of the ABI ổn định.Một con trỏ tùy chọn tới một mảng cấu trúc
PyMethodDefkết thúc bằngNULLtĩnh, khai báo các phương thức thông thường thuộc loại này.Đối với mỗi mục trong mảng, một mục được thêm vào từ điển của loại (xem
tp_dictbên dưới) có chứa bộ mô tả phương thức.Inheritance:
Trường này không được kế thừa bởi các kiểu con (các phương thức được kế thừa thông qua một cơ chế khác).
-
struct PyMemberDef *PyTypeObject.tp_members¶
The corresponding slot ID
Py_tp_membersis part of the ABI ổn định.Một con trỏ tùy chọn tới một mảng cấu trúc
PyMemberDefđược kết thúc bằngNULLtĩnh, khai báo các thành viên dữ liệu thông thường (trường hoặc vị trí) của các phiên bản thuộc loại này.Đối với mỗi mục trong mảng, một mục được thêm vào từ điển của loại (xem
tp_dictbên dưới) có chứa bộ mô tả thành viên.Inheritance:
Trường này không được kế thừa bởi các kiểu con (các thành viên được kế thừa thông qua một cơ chế khác).
-
struct PyGetSetDef *PyTypeObject.tp_getset¶
The corresponding slot ID
Py_tp_getsetis part of the ABI ổn định.Một con trỏ tùy chọn tới một mảng cấu trúc
PyGetSetDefđược kết thúc bằngNULLtĩnh, khai báo các thuộc tính được tính toán của các phiên bản thuộc loại này.Đối với mỗi mục trong mảng, một mục được thêm vào từ điển của loại (xem
tp_dictbên dưới) có chứa bộ mô tả getset.Inheritance:
Trường này không được kế thừa bởi các kiểu con (các thuộc tính được tính toán được kế thừa thông qua một cơ chế khác).
-
PyTypeObject *PyTypeObject.tp_base¶
The corresponding slot ID
Py_tp_baseis part of the ABI ổn định.Một con trỏ tùy chọn tới một kiểu cơ sở mà từ đó các thuộc tính kiểu được kế thừa. Ở cấp độ này, chỉ hỗ trợ kế thừa duy nhất; đa kế thừa yêu cầu tạo động một đối tượng kiểu bằng cách gọi siêu kiểu.
Ghi chú
Việc khởi tạo vị trí phải tuân theo các quy tắc khởi tạo toàn cầu. C99 yêu cầu bộ khởi tạo phải là "hằng số địa chỉ". Các bộ chỉ định hàm như
PyType_GenericNew(), với sự chuyển đổi ngầm định thành một con trỏ, là các hằng số địa chỉ C99 hợp lệ.Tuy nhiên, toán tử '&' đơn phân áp dụng cho biến không tĩnh như
PyBaseObject_Typekhông bắt buộc phải tạo ra hằng số địa chỉ. Trình biên dịch có thể hỗ trợ điều này (gcc có), MSVC thì không. Cả hai trình biên dịch đều tuân thủ tiêu chuẩn nghiêm ngặt trong hành vi cụ thể này.Do đó,
tp_basephải được đặt trong hàm init của mô-đun mở rộng.Inheritance:
Trường này không được kế thừa bởi các kiểu con (rõ ràng).
Default:
Trường này mặc định là
&PyBaseObject_Type(mà các lập trình viên Python gọi là loạiobject).
-
PyObject *PyTypeObject.tp_dict¶
Từ điển của loại được lưu trữ ở đây bởi
PyType_Ready().Trường này thường phải được khởi tạo thành
NULLtrước khi gọi PyType_Ready; nó cũng có thể được khởi tạo vào một từ điển chứa các thuộc tính ban đầu cho kiểu đó. KhiPyType_Ready()đã khởi tạo loại, các thuộc tính bổ sung cho loại đó chỉ có thể được thêm vào từ điển này nếu chúng không tương ứng với các hoạt động quá tải (như__add__()). Sau khi quá trình khởi tạo loại kết thúc, trường này sẽ được coi là chỉ đọc.Một số loại có thể không lưu trữ từ điển của chúng trong khe này. Sử dụng
PyType_GetDict()để truy xuất từ điển cho một loại tùy ý.Thay đổi trong phiên bản 3.12: Chi tiết bên trong: Đối với các kiểu dựng sẵn tĩnh, đây luôn là
NULL. Thay vào đó, lệnh cho các loại như vậy được lưu trữ trênPyInterpreterState. Sử dụngPyType_GetDict()để lấy lệnh cho một loại tùy ý.Inheritance:
Trường này không được kế thừa bởi các kiểu con (mặc dù các thuộc tính được xác định ở đây được kế thừa thông qua một cơ chế khác).
Default:
Nếu trường này là
NULL,PyType_Ready()sẽ gán một từ điển mới cho nó.Cảnh báo
Sẽ không an toàn khi sử dụng
PyDict_SetItem()trên hoặc sửa đổitp_dictbằng từ điển C-API.
-
descrgetfunc PyTypeObject.tp_descr_get¶
The corresponding slot ID
Py_tp_descr_getis part of the ABI ổn định.Một con trỏ tùy chọn tới hàm "mô tả get".
Chữ ký hàm là:
PyObject * tp_descr_get(PyObject *self, PyObject *obj, PyObject *type);
Inheritance:
Trường này được kế thừa bởi các kiểu con.
-
descrsetfunc PyTypeObject.tp_descr_set¶
The corresponding slot ID
Py_tp_descr_setis part of the ABI ổn định.Một con trỏ tùy chọn tới một hàm để thiết lập và xóa giá trị của bộ mô tả.
Chữ ký hàm là:
int tp_descr_set(PyObject *self, PyObject *obj, PyObject *giá trị);
Đối số value được đặt thành
NULLđể xóa giá trị.Inheritance:
Trường này được kế thừa bởi các kiểu con.
-
Py_ssize_t PyTypeObject.tp_dictoffset¶
Mặc dù trường này vẫn được hỗ trợ nhưng thay vào đó, bạn nên sử dụng
Py_TPFLAGS_MANAGED_DICTnếu có thể.Nếu các thể hiện của loại này có một từ điển chứa các biến thể hiện, thì trường này khác 0 và chứa phần bù trong các thể hiện của loại từ điển biến thể hiện; phần bù này được sử dụng bởi
PyObject_GenericGetAttr().Đừng nhầm lẫn trường này với
tp_dict; đó là từ điển cho các thuộc tính của chính đối tượng kiểu đó.Giá trị chỉ định độ lệch của từ điển tính từ đầu cấu trúc cá thể.
Zz000zz nên được coi là chỉ ghi. Để đưa con trỏ tới từ điển, hãy gọi
PyObject_GenericGetDict(). Việc gọiPyObject_GenericGetDict()có thể cần phân bổ bộ nhớ cho từ điển, do đó, việc gọiPyObject_GetAttr()có thể hiệu quả hơn khi truy cập một thuộc tính trên đối tượng.Sẽ có lỗi khi đặt cả bit
Py_TPFLAGS_MANAGED_DICTvàtp_dictoffset.Inheritance:
Trường này được kế thừa bởi các kiểu con. Một kiểu con không được ghi đè phần bù này; làm như vậy có thể không an toàn nếu mã C cố gắng truy cập từ điển ở phần bù trước đó. Để hỗ trợ kế thừa đúng cách, hãy sử dụng
Py_TPFLAGS_MANAGED_DICT.Default:
Khe này không có mặc định. Đối với static types, nếu trường là
NULLthì không có__dict__nào được tạo cho các phiên bản.Nếu bit
Py_TPFLAGS_MANAGED_DICTđược đặt trong trườngtp_flagsthìtp_dictoffsetsẽ được đặt thành-1, để biểu thị rằng việc sử dụng trường này là không an toàn.
-
initproc PyTypeObject.tp_init¶
The corresponding slot ID
Py_tp_initis part of the ABI ổn định.Một con trỏ tùy chọn tới một hàm khởi tạo cá thể.
Hàm này tương ứng với phương thức
__init__()của các lớp. Giống như__init__(), có thể tạo một phiên bản mà không cần gọi__init__()và có thể khởi tạo lại một phiên bản bằng cách gọi lại phương thức__init__()của nó.Chữ ký hàm là:
int tp_init(PyObject *self, PyObject *args, PyObject *kwds);
Đối số self là thể hiện được khởi tạo; các đối số args và kwds đại diện cho các đối số từ khóa và vị trí của lệnh gọi tới
__init__().Hàm
tp_init, nếu không phải làNULL, được gọi khi một phiên bản được tạo bình thường bằng cách gọi kiểu của nó, sau khi hàmtp_newcủa kiểu đó trả về một phiên bản của kiểu đó. Nếu hàmtp_newtrả về một phiên bản của một số loại khác không phải là kiểu con của loại ban đầu thì không có hàmtp_initnào được gọi; nếutp_newtrả về một thể hiện của một kiểu con của kiểu ban đầu thìtp_initcủa kiểu con đó sẽ được gọi.Trả về
0nếu thành công,-1và đặt ngoại lệ nếu có lỗi.Inheritance:
Trường này được kế thừa bởi các kiểu con.
Default:
Đối với static types trường này không có giá trị mặc định.
-
allocfunc PyTypeObject.tp_alloc¶
The corresponding slot ID
Py_tp_allocis part of the ABI ổn định.Một con trỏ tùy chọn tới một hàm phân bổ cá thể.
Chữ ký hàm là:
PyObject *tp_alloc(PyTypeObject *self, Py_ssize_t nitems);
Inheritance:
Các kiểu con tĩnh kế thừa vị trí này, sẽ là
PyType_GenericAlloc()nếu được kế thừa từobject.Heap subtypes không kế thừa vị trí này.
Default:
Đối với các kiểu con heap, trường này luôn được đặt thành
PyType_GenericAlloc().Đối với các kiểu con tĩnh, vị trí này được kế thừa (xem ở trên).
-
newfunc PyTypeObject.tp_new¶
The corresponding slot ID
Py_tp_newis part of the ABI ổn định.Một con trỏ tùy chọn tới hàm tạo cá thể.
Chữ ký hàm là:
PyObject *tp_new(PyTypeObject *subtype, PyObject *args, PyObject *kwds);
Đối số subtype là loại đối tượng được tạo; các đối số args và kwds đại diện cho các đối số từ khóa và vị trí của lệnh gọi đến loại. Lưu ý rằng subtype không nhất thiết phải bằng loại có hàm
tp_newđược gọi; nó có thể là một kiểu con của loại đó (nhưng không phải là loại không liên quan).Hàm
tp_newsẽ gọisubtype->tp_alloc(subtype, nitems)để phân bổ không gian cho đối tượng, sau đó chỉ thực hiện khởi tạo thêm nếu thực sự cần thiết. Việc khởi tạo có thể được bỏ qua hoặc lặp lại một cách an toàn nên được đặt trong trình xử lýtp_init. Một nguyên tắc nhỏ là đối với các loại không thể thay đổi, tất cả quá trình khởi tạo phải diễn ra trongtp_new, trong khi đối với các loại có thể thay đổi, hầu hết quá trình khởi tạo phải được hoãn lại thànhtp_init.Đặt cờ
Py_TPFLAGS_DISALLOW_INSTANTIATIONđể không cho phép tạo các phiên bản thuộc loại này trong Python.Inheritance:
Trường này được kế thừa bởi các kiểu con, ngoại trừ trường này không được kế thừa bởi static types có
tp_baselàNULLhoặc&PyBaseObject_Type.Default:
Đối với static types trường này không có giá trị mặc định. Điều này có nghĩa là nếu vị trí được xác định là
NULLthì loại này không thể được gọi để tạo phiên bản mới; có lẽ có một số cách khác để tạo phiên bản, như chức năng của nhà máy.
-
freefunc PyTypeObject.tp_free¶
The corresponding slot ID
Py_tp_freeis part of the ABI ổn định.Một con trỏ tùy chọn tới một hàm phân bổ cá thể. Chữ ký của nó là:
void tp_free(void *self);
Chức năng này phải giải phóng bộ nhớ được phân bổ bởi
tp_alloc.Inheritance:
Các kiểu con tĩnh kế thừa vị trí này, sẽ là
PyObject_Free()nếu được kế thừa từobject. Ngoại lệ: Nếu loại hỗ trợ thu thập rác (tức là cờPy_TPFLAGS_HAVE_GCđược đặt trongtp_flags) và nó sẽ kế thừaPyObject_Free()thì vị trí này không được kế thừa mà thay vào đó được mặc định làPyObject_GC_Del().Heap subtypes không kế thừa vị trí này.
Default:
Đối với heap subtypes, vị trí này mặc định là bộ phân bổ phù hợp để khớp với
PyType_GenericAlloc()và giá trị của cờPy_TPFLAGS_HAVE_GC.Đối với các kiểu con tĩnh, vị trí này được kế thừa (xem ở trên).
-
inquiry PyTypeObject.tp_is_gc¶
The corresponding slot ID
Py_tp_is_gcis part of the ABI ổn định.Một con trỏ tùy chọn tới một hàm được gọi bởi trình thu gom rác.
Trình thu gom rác cần biết liệu một đối tượng cụ thể có thể được thu thập hay không. Thông thường, chỉ cần xem trường
tp_flagscủa loại đối tượng và kiểm tra bit cờPy_TPFLAGS_HAVE_GClà đủ. Nhưng một số loại có sự kết hợp giữa các phiên bản được phân bổ tĩnh và động và các phiên bản được phân bổ tĩnh không thể thu thập được. Những loại như vậy nên xác định chức năng này; nó sẽ trả về1cho phiên bản có thể sưu tập và0cho phiên bản không thể sưu tập. Chữ ký là:int tp_is_gc(PyObject *self);
(Ví dụ duy nhất về điều này là chính các loại. Siêu dữ liệu,
PyType_Type, xác định hàm này để phân biệt giữa tĩnh và dynamically allocated types.)Inheritance:
Trường này được kế thừa bởi các kiểu con.
Default:
Khe này không có mặc định. Nếu trường này là
NULLthìPy_TPFLAGS_HAVE_GCđược sử dụng làm chức năng tương đương.
-
PyObject *PyTypeObject.tp_bases¶
The corresponding slot ID
Py_tp_basesis part of the ABI ổn định.Tuple của các loại cơ sở.
Trường này phải được đặt thành
NULLvà được coi là chỉ đọc. Python sẽ điền nó khi loại làinitialized.Đối với các lớp được tạo động,
Py_tp_basesslotcó thể được sử dụng thay cho đối số bases củaPyType_FromSpecWithBases(). Hình thức đối số được ưa thích.Cảnh báo
Đa kế thừa không hoạt động tốt đối với các kiểu được xác định tĩnh. Nếu bạn đặt
tp_basesthành một bộ dữ liệu, Python sẽ không phát sinh lỗi nhưng một số vị trí sẽ chỉ được kế thừa từ cơ sở đầu tiên.Inheritance:
Trường này không được kế thừa.
-
PyObject *PyTypeObject.tp_mro¶
Bộ chứa tập hợp các loại cơ sở mở rộng, bắt đầu bằng chính loại đó và kết thúc bằng
object, theo Thứ tự phân giải phương thức.Trường này phải được đặt thành
NULLvà được coi là chỉ đọc. Python sẽ điền nó khi loại làinitialized.Inheritance:
Trường này không được kế thừa; nó được tính toán mới bởi
PyType_Ready().
-
PyObject *PyTypeObject.tp_cache¶
Chưa sử dụng. Chỉ sử dụng nội bộ.
Inheritance:
Trường này không được kế thừa.
-
void *PyTypeObject.tp_subclasses¶
Một tập hợp các lớp con. Chỉ sử dụng nội bộ. Có thể là một con trỏ không hợp lệ.
Để có danh sách các lớp con, hãy gọi phương thức Python
__subclasses__().Thay đổi trong phiên bản 3.12: Đối với một số loại, trường này không chứa PyObject* hợp lệ. Loại đã được đổi thành void* để biểu thị điều này.
Inheritance:
Trường này không được kế thừa.
-
PyObject *PyTypeObject.tp_weaklist¶
Đầu danh sách tham chiếu yếu, dành cho các tham chiếu yếu đến đối tượng kiểu này. Không được thừa kế. Chỉ sử dụng nội bộ.
Thay đổi trong phiên bản 3.12: Chi tiết bên trong: Đối với các kiểu dựng sẵn tĩnh, đây luôn là
NULL, ngay cả khi các điểm yếu được thêm vào. Thay vào đó, các điểm yếu cho mỗi điểm được lưu trữ trênPyInterpreterState. Sử dụng macro C-API công khai hoặc macro_PyObject_GET_WEAKREFS_LISTPTR()nội bộ để tránh sự phân biệt.Inheritance:
Trường này không được kế thừa.
-
destructor PyTypeObject.tp_del¶
The corresponding slot ID
Py_tp_delis part of the ABI ổn định.Trường này không còn được dùng nữa. Thay vào đó hãy sử dụng
tp_finalize.
-
unsigned int PyTypeObject.tp_version_tag¶
Được sử dụng để lập chỉ mục vào bộ đệm phương thức. Chỉ sử dụng nội bộ.
Inheritance:
Trường này không được kế thừa.
-
destructor PyTypeObject.tp_finalize¶
The corresponding slot ID
Py_tp_finalizeis part of the ABI ổn định kể từ phiên bản 3.5.Một con trỏ tùy chọn tới một hàm hoàn thiện cá thể. Đây là cách triển khai C của phương thức đặc biệt
__del__(). Chữ ký của nó là:void tp_finalize(PyObject *self);
Mục đích chính của việc hoàn thiện là thực hiện bất kỳ hoạt động dọn dẹp không tầm thường nào phải được thực hiện trước khi đối tượng bị hủy, trong khi đối tượng và mọi đối tượng khác mà nó tham chiếu trực tiếp hoặc gián tiếp vẫn ở trạng thái nhất quán. Trình hoàn thiện được phép thực thi mã Python tùy ý.
Trước khi Python tự động hoàn thiện một đối tượng, một số tham chiếu trực tiếp hoặc gián tiếp của đối tượng có thể đã được tự động hoàn thiện. Tuy nhiên, chưa có người giới thiệu nào được tự động xóa (
tp_clear).Các đối tượng chưa được hoàn thiện khác có thể vẫn đang sử dụng một đối tượng đã được hoàn thiện, do đó, trình hoàn thiện phải để đối tượng ở trạng thái lành mạnh (ví dụ: các bất biến vẫn được đáp ứng).
Ghi chú
Sau khi Python tự động hoàn thiện một đối tượng, Python có thể bắt đầu tự động xóa (
tp_clear) đối tượng đó và các tham chiếu của nó (trực tiếp và gián tiếp). Các đối tượng bị xóa không được đảm bảo ở trạng thái nhất quán; một đối tượng hoàn thiện phải có khả năng chấp nhận các tham chiếu đã được xóa.Ghi chú
Một đối tượng không được đảm bảo sẽ được tự động hoàn thiện trước khi hàm hủy của nó (
tp_dealloc) được gọi. Bạn nên gọiPyObject_CallFinalizerFromDealloc()khi bắt đầutp_deallocđể đảm bảo rằng đối tượng luôn được hoàn thiện trước khi hủy.Ghi chú
Hàm
tp_finalizecó thể được gọi từ bất kỳ luồng nào, mặc dù GIL sẽ được giữ.Ghi chú
Hàm
tp_finalizecó thể được gọi trong khi tắt máy, sau khi một số biến toàn cục đã bị xóa. Xem tài liệu về phương pháp__del__()để biết chi tiết.Khi Python hoàn thiện một đối tượng, nó hoạt động giống như thuật toán sau:
Python có thể đánh dấu đối tượng là finalized. Hiện tại, Python luôn đánh dấu các đối tượng có loại hỗ trợ thu thập rác (tức là cờ
Py_TPFLAGS_HAVE_GCđược đặt trongtp_flags) và không bao giờ đánh dấu các loại đối tượng khác; điều này có thể thay đổi trong phiên bản tương lai.Nếu đối tượng không được đánh dấu là finalized và hàm hoàn thiện
tp_finalizecủa nó không phải làNULLthì hàm hoàn thiện sẽ được gọi.Nếu hàm bộ hoàn thiện được gọi và bộ hoàn thiện làm cho đối tượng có thể truy cập được (tức là có một tham chiếu đến đối tượng và nó không phải là thành viên của cyclic isolate), thì bộ hoàn thiện được cho là có đối tượng resurrected. Không xác định được liệu trình hoàn thiện cũng có thể phục hồi đối tượng hay không bằng cách thêm một tham chiếu mới vào đối tượng mà không thể truy cập được, tức là đối tượng (vẫn) là thành viên của một cô lập tuần hoàn.
Nếu trình hoàn thiện phục hồi đối tượng, quá trình hủy đối tượng đang chờ xử lý sẽ bị hủy và dấu finalized của đối tượng có thể bị xóa nếu có. Hiện tại, Python không bao giờ xóa dấu finalized; điều này có thể thay đổi trong phiên bản tương lai.
Automatic finalization đề cập đến bất kỳ quá trình hoàn thiện nào được thực hiện bởi Python ngoại trừ thông qua các lệnh gọi tới
PyObject_CallFinalizer()hoặcPyObject_CallFinalizerFromDealloc(). Không có đảm bảo nào được đưa ra về thời điểm, nếu hoặc tần suất một đối tượng được tự động hoàn thiện, ngoại trừ:Python sẽ không tự động hoàn thiện một đối tượng nếu nó có thể truy cập được, tức là có một tham chiếu đến nó và nó không phải là thành viên của cyclic isolate.
Python sẽ không tự động hoàn thiện một đối tượng nếu việc hoàn thiện nó không đánh dấu đối tượng là finalized. Hiện tại, điều này áp dụng cho các đối tượng có loại không hỗ trợ thu gom rác, tức là cờ
Py_TPFLAGS_HAVE_GCkhông được đặt. Những đối tượng như vậy vẫn có thể được hoàn thiện thủ công bằng cách gọiPyObject_CallFinalizer()hoặcPyObject_CallFinalizerFromDealloc().Python sẽ không tự động hoàn thiện đồng thời hai thành viên bất kỳ của cyclic isolate.
Python sẽ không tự động hoàn thiện một đối tượng sau khi nó đã tự động xóa (
tp_clear) đối tượng đó.Nếu một đối tượng là thành viên của cyclic isolate, Python sẽ không tự động hoàn thiện nó sau khi tự động xóa (xem
tp_clear) bất kỳ thành viên nào khác.Python sẽ tự động hoàn thiện mọi thành viên của cyclic isolate trước khi nó tự động xóa (xem
tp_clear) bất kỳ thành viên nào trong số đó.Nếu Python định tự động xóa một đối tượng (
tp_clear), nó sẽ tự động hoàn thiện đối tượng đó trước tiên.
Python hiện chỉ tự động hoàn thiện các đối tượng là thành viên của cyclic isolate, nhưng các phiên bản trong tương lai có thể hoàn thiện các đối tượng thường xuyên trước khi chúng bị phá hủy.
Để hoàn thiện một đối tượng theo cách thủ công, không gọi trực tiếp hàm này; thay vào đó hãy gọi
PyObject_CallFinalizer()hoặcPyObject_CallFinalizerFromDealloc().tp_finalizenên giữ nguyên trạng thái ngoại lệ hiện tại. Cách được khuyến nghị để viết một trình hoàn thiện không tầm thường là sao lưu ngoại lệ ngay từ đầu bằng cách gọiPyErr_GetRaisedException()và khôi phục ngoại lệ ở cuối bằng cách gọiPyErr_SetRaisedException(). Nếu gặp phải ngoại lệ ở giữa trình hoàn thiện, hãy đăng nhập và xóa ngoại lệ đó bằngPyErr_WriteUnraisable()hoặcPyErr_FormatUnraisable(). Ví dụ:khoảng trống tĩnh foo_finalize(PyObject *self) { // Lưu ngoại lệ hiện tại, nếu có. PyObject *exc = PyErr_GetRaisedException(); // ... if (do_something_that_might_raise() != thành công_indicator) { PyErr_WriteUnraiseable(self); phải làm xong; } xong: // Khôi phục ngoại lệ đã lưu. Điều này âm thầm loại bỏ mọi ngoại lệ // được nêu ở trên, vì vậy hãy nhớ gọi PyErr_WriteUnraisable trước nếu // cần thiết. PyErr_SetRaisedException(exc); }
Inheritance:
Trường này được kế thừa bởi các kiểu con.
Added in version 3.4.
Thay đổi trong phiên bản 3.8: Trước phiên bản 3.8, cần phải đặt bit cờ
Py_TPFLAGS_HAVE_FINALIZEđể sử dụng trường này. Điều này không còn cần thiết nữa.Xem thêm
PEP 442: "Hoàn thiện đối tượng an toàn"
Vòng đời của đối tượng để biết chi tiết về mối liên hệ giữa vị trí này với các vị trí khác.
-
vectorcallfunc PyTypeObject.tp_vectorcall¶
The corresponding slot ID
Py_tp_vectorcallis part of the ABI ổn định kể từ phiên bản 3.14.Một vectorcall function để sử dụng cho các cuộc gọi thuộc loại đối tượng này (chứ không phải các phiên bản). Nói cách khác,
tp_vectorcallcó thể được sử dụng để tối ưu hóatype.__call__, thường trả về một phiên bản mới của type.Giống như bất kỳ hàm vectorcall nào, nếu
tp_vectorcalllàNULLthì giao thức tp_call (Py_TYPE(type)->tp_call) sẽ được sử dụng thay thế.Ghi chú
vectorcall protocol yêu cầu hàm vectorcall có hành vi tương tự như
tp_calltương ứng. Điều này có nghĩa làtype->tp_vectorcallphải phù hợp với hành vi củaPy_TYPE(type)->tp_call.Cụ thể, nếu type sử dụng siêu dữ liệu mặc định thì
type->tp_vectorcallphải hoạt động giống như PyType_Type->tp_call, đó là:gọi
type->tp_new,nếu kết quả là một lớp con của type, hãy gọi
type->tp_inittrên kết quả củatp_newvàtrả về kết quả của
tp_new.
Thông thường,
tp_vectorcallbị ghi đè để tối ưu hóa quy trình này chotp_newvàtp_initcụ thể. Khi thực hiện việc này đối với các loại có thể phân lớp người dùng, hãy lưu ý rằng cả hai đều có thể bị ghi đè (sử dụng__new__()và__init__()tương ứng).Inheritance:
Trường này không bao giờ được kế thừa.
Added in version 3.9: (trường này tồn tại từ phiên bản 3.8 nhưng nó chỉ được sử dụng kể từ phiên bản 3.9)
-
unsigned char PyTypeObject.tp_watched¶
Nội bộ. Không sử dụng.
Added in version 3.12.
Các loại tĩnh¶
Theo truyền thống, các loại được xác định trong mã C là static, nghĩa là cấu trúc PyTypeObject tĩnh được xác định trực tiếp trong mã và được khởi tạo bằng PyType_Ready().
Điều này dẫn đến các loại bị giới hạn so với các loại được xác định trong Python:
Các kiểu tĩnh được giới hạn ở một cơ sở, tức là chúng không thể sử dụng nhiều kế thừa.
Các đối tượng loại tĩnh (nhưng không nhất thiết phải là phiên bản của chúng) là bất biến. Không thể thêm hoặc sửa đổi các thuộc tính của đối tượng loại từ Python.
Các đối tượng loại tĩnh được chia sẻ trên sub-interpreters, vì vậy chúng không được bao gồm bất kỳ trạng thái cụ thể nào của trình thông dịch phụ.
Ngoài ra, vì PyTypeObject chỉ là một phần của Limited API dưới dạng cấu trúc mờ, nên mọi mô-đun mở rộng sử dụng kiểu tĩnh phải được biên dịch cho một phiên bản phụ Python cụ thể.
Các loại đống¶
Một thay thế cho static types là heap-allocated types, hay gọi tắt là heap types, tương ứng chặt chẽ với các lớp được tạo bởi câu lệnh class của Python. Các loại heap có bộ cờ Py_TPFLAGS_HEAPTYPE.
Điều này được thực hiện bằng cách điền vào cấu trúc PyType_Spec và gọi PyType_FromSpec(), PyType_FromSpecWithBases(), PyType_FromModuleAndSpec() hoặc PyType_FromMetaclass().
Cấu trúc đối tượng số¶
-
type PyNumberMethods¶
Cấu trúc này chứa các con trỏ tới các hàm mà đối tượng sử dụng để thực hiện giao thức số. Mỗi hàm được sử dụng bởi hàm có tên tương tự được ghi trong phần Giao thức số.
Đây là định nghĩa cấu trúc:
cấu trúc typedef { nhị phân nb_add; nhị phân nb_subtract; nhị phân nb_multiply; nhị phân nb_remainder; nhị phân nb_divmod; ternaryfunc nb_power; unaryfunc nb_ Negative; unaryfunc nb_posid; unaryfunc nb_absolute; yêu cầu nb_bool; unaryfunc nb_invert; nhị phân nb_lshift; nhị phân nb_rshift; nhị phân nb_and; nhị phân nb_xor; nhị phân nb_or; unaryfunc nb_int; void *nb_reserved; unaryfunc nb_float; nhị phân nb_inplace_add; nhị phân nb_inplace_subtract; nhị phân nb_inplace_multiply; nhị phân nb_inplace_remainder; ternaryfunc nb_inplace_power; nhị phân nb_inplace_lshift; nhị phân nb_inplace_rshift; nhị phân nb_inplace_and; nhị phân nb_inplace_xor; nhị phân nb_inplace_or; nhị phân nb_floor_divide; nhị phân nb_true_divide; nhị phân nb_inplace_floor_divide; nhị phân nb_inplace_true_divide; unaryfunc nb_index; nhị phân nb_matrix_multiply; nhị phân nb_inplace_matrix_multiply; } Phương thức PyNumber;
Ghi chú
Hàm nhị phân và hàm ba ngôi phải kiểm tra loại của tất cả toán hạng của chúng và thực hiện các chuyển đổi cần thiết (ít nhất một trong các toán hạng là một thể hiện của loại được xác định). Nếu thao tác không được xác định cho các toán hạng đã cho, các hàm nhị phân và bậc ba phải trả về
Py_NotImplemented, nếu xảy ra lỗi khác thì chúng phải trả vềNULLvà đặt một ngoại lệ.Ghi chú
Trường
nb_reservedphải luôn làNULL. Trước đây nó được gọi lànb_longvà được đổi tên trong Python 3.0.1.
-
binaryfunc PyNumberMethods.nb_add¶
The corresponding slot ID
Py_nb_addis part of the ABI ổn định.
-
binaryfunc PyNumberMethods.nb_subtract¶
The corresponding slot ID
Py_nb_subtractis part of the ABI ổn định.
-
binaryfunc PyNumberMethods.nb_multiply¶
The corresponding slot ID
Py_nb_multiplyis part of the ABI ổn định.
-
binaryfunc PyNumberMethods.nb_remainder¶
The corresponding slot ID
Py_nb_remainderis part of the ABI ổn định.
-
binaryfunc PyNumberMethods.nb_divmod¶
The corresponding slot ID
Py_nb_divmodis part of the ABI ổn định.
-
ternaryfunc PyNumberMethods.nb_power¶
The corresponding slot ID
Py_nb_poweris part of the ABI ổn định.
-
unaryfunc PyNumberMethods.nb_negative¶
The corresponding slot ID
Py_nb_negativeis part of the ABI ổn định.
-
unaryfunc PyNumberMethods.nb_positive¶
The corresponding slot ID
Py_nb_positiveis part of the ABI ổn định.
-
unaryfunc PyNumberMethods.nb_absolute¶
The corresponding slot ID
Py_nb_absoluteis part of the ABI ổn định.
-
inquiry PyNumberMethods.nb_bool¶
The corresponding slot ID
Py_nb_boolis part of the ABI ổn định.
-
unaryfunc PyNumberMethods.nb_invert¶
The corresponding slot ID
Py_nb_invertis part of the ABI ổn định.
-
binaryfunc PyNumberMethods.nb_lshift¶
The corresponding slot ID
Py_nb_lshiftis part of the ABI ổn định.
-
binaryfunc PyNumberMethods.nb_rshift¶
The corresponding slot ID
Py_nb_rshiftis part of the ABI ổn định.
-
binaryfunc PyNumberMethods.nb_and¶
The corresponding slot ID
Py_nb_andis part of the ABI ổn định.
-
binaryfunc PyNumberMethods.nb_xor¶
The corresponding slot ID
Py_nb_xoris part of the ABI ổn định.
-
binaryfunc PyNumberMethods.nb_or¶
The corresponding slot ID
Py_nb_oris part of the ABI ổn định.
-
unaryfunc PyNumberMethods.nb_int¶
The corresponding slot ID
Py_nb_intis part of the ABI ổn định.
-
void *PyNumberMethods.nb_reserved¶
-
unaryfunc PyNumberMethods.nb_float¶
The corresponding slot ID
Py_nb_floatis part of the ABI ổn định.
-
binaryfunc PyNumberMethods.nb_inplace_add¶
The corresponding slot ID
Py_nb_inplace_addis part of the ABI ổn định.
-
binaryfunc PyNumberMethods.nb_inplace_subtract¶
The corresponding slot ID
Py_nb_inplace_subtractis part of the ABI ổn định.
-
binaryfunc PyNumberMethods.nb_inplace_multiply¶
The corresponding slot ID
Py_nb_inplace_multiplyis part of the ABI ổn định.
-
binaryfunc PyNumberMethods.nb_inplace_remainder¶
The corresponding slot ID
Py_nb_inplace_remainderis part of the ABI ổn định.
-
ternaryfunc PyNumberMethods.nb_inplace_power¶
The corresponding slot ID
Py_nb_inplace_poweris part of the ABI ổn định.
-
binaryfunc PyNumberMethods.nb_inplace_lshift¶
The corresponding slot ID
Py_nb_inplace_lshiftis part of the ABI ổn định.
-
binaryfunc PyNumberMethods.nb_inplace_rshift¶
The corresponding slot ID
Py_nb_inplace_rshiftis part of the ABI ổn định.
-
binaryfunc PyNumberMethods.nb_inplace_and¶
The corresponding slot ID
Py_nb_inplace_andis part of the ABI ổn định.
-
binaryfunc PyNumberMethods.nb_inplace_xor¶
The corresponding slot ID
Py_nb_inplace_xoris part of the ABI ổn định.
-
binaryfunc PyNumberMethods.nb_inplace_or¶
The corresponding slot ID
Py_nb_inplace_oris part of the ABI ổn định.
-
binaryfunc PyNumberMethods.nb_floor_divide¶
The corresponding slot ID
Py_nb_floor_divideis part of the ABI ổn định.
-
binaryfunc PyNumberMethods.nb_true_divide¶
The corresponding slot ID
Py_nb_true_divideis part of the ABI ổn định.
-
binaryfunc PyNumberMethods.nb_inplace_floor_divide¶
The corresponding slot ID
Py_nb_inplace_floor_divideis part of the ABI ổn định.
-
binaryfunc PyNumberMethods.nb_inplace_true_divide¶
The corresponding slot ID
Py_nb_inplace_true_divideis part of the ABI ổn định.
-
unaryfunc PyNumberMethods.nb_index¶
The corresponding slot ID
Py_nb_indexis part of the ABI ổn định.
-
binaryfunc PyNumberMethods.nb_matrix_multiply¶
The corresponding slot ID
Py_nb_matrix_multiplyis part of the ABI ổn định kể từ phiên bản 3.5.
-
binaryfunc PyNumberMethods.nb_inplace_matrix_multiply¶
The corresponding slot ID
Py_nb_inplace_matrix_multiplyis part of the ABI ổn định kể từ phiên bản 3.5.
Ánh xạ cấu trúc đối tượng¶
-
type PyMappingMethods¶
Cấu trúc này chứa các con trỏ tới các hàm mà đối tượng sử dụng để thực hiện giao thức ánh xạ. Nó có ba thành viên:
-
lenfunc PyMappingMethods.mp_length¶
The corresponding slot ID
Py_mp_lengthis part of the ABI ổn định.Hàm này được
PyMapping_Size()vàPyObject_Size()sử dụng và có cùng chữ ký. Khe này có thể được đặt thànhNULLnếu đối tượng không có độ dài xác định.
-
binaryfunc PyMappingMethods.mp_subscript¶
The corresponding slot ID
Py_mp_subscriptis part of the ABI ổn định.Hàm này được
PyObject_GetItem()vàPySequence_GetSlice()sử dụng và có cùng chữ ký vớiPyObject_GetItem(). Khe này phải được lấp đầy để hàmPyMapping_Check()trả về1, nếu không thì có thể làNULL.
-
objobjargproc PyMappingMethods.mp_ass_subscript¶
The corresponding slot ID
Py_mp_ass_subscriptis part of the ABI ổn định.Chức năng này được sử dụng bởi
PyObject_SetItem(),PyObject_DelItem(),PySequence_SetSlice()vàPySequence_DelSlice(). Nó có cùng chữ ký vớiPyObject_SetItem(), nhưng v cũng có thể được đặt thànhNULLđể xóa một mục. Nếu vị trí này làNULL, đối tượng không hỗ trợ gán và xóa mục.
Cấu trúc đối tượng trình tự¶
-
type PySequenceMethods¶
Cấu trúc này chứa các con trỏ tới các hàm mà đối tượng sử dụng để thực hiện giao thức tuần tự.
-
lenfunc PySequenceMethods.sq_length¶
The corresponding slot ID
Py_sq_lengthis part of the ABI ổn định.Hàm này được
PySequence_Size()vàPyObject_Size()sử dụng và có cùng chữ ký. Nó cũng được sử dụng để xử lý các chỉ số âm thông qua các khesq_itemvàsq_ass_item.
-
binaryfunc PySequenceMethods.sq_concat¶
The corresponding slot ID
Py_sq_concatis part of the ABI ổn định.Chức năng này được
PySequence_Concat()sử dụng và có cùng chữ ký. Nó cũng được sử dụng bởi toán tử+, sau khi thử phép cộng số qua khenb_add.
-
ssizeargfunc PySequenceMethods.sq_repeat¶
The corresponding slot ID
Py_sq_repeatis part of the ABI ổn định.Chức năng này được
PySequence_Repeat()sử dụng và có cùng chữ ký. Nó cũng được sử dụng bởi toán tử*, sau khi thử nhân số qua khenb_multiply.
-
ssizeargfunc PySequenceMethods.sq_item¶
The corresponding slot ID
Py_sq_itemis part of the ABI ổn định.Chức năng này được
PySequence_GetItem()sử dụng và có cùng chữ ký. Nó cũng đượcPyObject_GetItem()sử dụng sau khi thử đăng ký qua khemp_subscript. Khe này phải được lấp đầy để hàmPySequence_Check()trả về1, nếu không thì có thể làNULL.Các chỉ mục âm được xử lý như sau: nếu khe
sq_lengthđược lấp đầy, nó sẽ được gọi và độ dài chuỗi được sử dụng để tính chỉ mục dương được chuyển đếnsq_item. Nếusq_lengthlàNULL, chỉ mục sẽ được truyền vào hàm.
-
ssizeobjargproc PySequenceMethods.sq_ass_item¶
The corresponding slot ID
Py_sq_ass_itemis part of the ABI ổn định.Chức năng này được
PySequence_SetItem()sử dụng và có cùng chữ ký. Nó cũng đượcPyObject_SetItem()vàPyObject_DelItem()sử dụng, sau khi thử gán và xóa vật phẩm qua khemp_ass_subscript. Khe này có thể được để lại choNULLnếu đối tượng không hỗ trợ gán và xóa vật phẩm.
-
objobjproc PySequenceMethods.sq_contains¶
The corresponding slot ID
Py_sq_containsis part of the ABI ổn định.Chức năng này có thể được
PySequence_Contains()sử dụng và có cùng chữ ký. Vị trí này có thể được để lại choNULL, trong trường hợp này,PySequence_Contains()chỉ đơn giản duyệt qua chuỗi cho đến khi tìm thấy kết quả khớp.
-
binaryfunc PySequenceMethods.sq_inplace_concat¶
The corresponding slot ID
Py_sq_inplace_concatis part of the ABI ổn định.Chức năng này được
PySequence_InPlaceConcat()sử dụng và có cùng chữ ký. Nó sẽ sửa đổi toán hạng đầu tiên của nó và trả về nó. Khe này có thể để lại choNULL, trong trường hợp nàyPySequence_InPlaceConcat()sẽ rơi vềPySequence_Concat(). Nó cũng được sử dụng bởi phép gán tăng cường+=, sau khi thử phép cộng số tại chỗ thông qua khenb_inplace_add.
-
ssizeargfunc PySequenceMethods.sq_inplace_repeat¶
The corresponding slot ID
Py_sq_inplace_repeatis part of the ABI ổn định.Chức năng này được
PySequence_InPlaceRepeat()sử dụng và có cùng chữ ký. Nó sẽ sửa đổi toán hạng đầu tiên của nó và trả về nó. Khe này có thể để lại choNULL, trong trường hợp nàyPySequence_InPlaceRepeat()sẽ rơi vềPySequence_Repeat(). Nó cũng được sử dụng bởi phép gán tăng cường*=, sau khi thử phép nhân số tại chỗ thông qua khenb_inplace_multiply.
Cấu trúc đối tượng đệm¶
-
type PyBufferProcs¶
Cấu trúc này chứa các con trỏ tới các hàm mà Buffer protocol yêu cầu. Giao thức xác định cách đối tượng nhà xuất khẩu có thể hiển thị dữ liệu nội bộ của nó cho đối tượng người tiêu dùng.
-
getbufferproc PyBufferProcs.bf_getbuffer¶
The corresponding slot ID
Py_bf_getbufferis part of the ABI ổn định kể từ phiên bản 3.11.Chữ ký của hàm này là:
int (PyObject *exporter, Py_buffer *view, cờ int);
Xử lý yêu cầu tới exporter để điền vào view theo chỉ định của flags. Ngoại trừ điểm (3), việc triển khai chức năng này MUST thực hiện các bước sau:
Kiểm tra xem yêu cầu có thể được đáp ứng hay không. Nếu không, hãy tăng
BufferError, đặt view->obj thànhNULLvà trả về-1.Điền vào các trường được yêu cầu.
Tăng bộ đếm nội bộ cho số lượng xuất khẩu.
Đặt view->obj thành exporter và tăng view->obj.
Trả về
0.
Thread safety:
Trong free-threaded build, việc triển khai phải đảm bảo:
Gia số bộ đếm xuất ở bước (3) là nguyên tử.
Dữ liệu bộ đệm cơ bản vẫn hợp lệ và ở vị trí bộ nhớ ổn định trong suốt thời gian xuất dữ liệu.
Đối với các đối tượng hỗ trợ thay đổi kích thước hoặc phân bổ lại (chẳng hạn như
bytearray), bộ đếm xuất được kiểm tra nguyên tử trước các hoạt động đó vàBufferErrorđược tăng lên nếu tồn tại xuất.Chức năng này an toàn khi gọi đồng thời từ nhiều luồng.
Xem thêm An toàn luồng cho các đối tượng MemoryView để biết các đảm bảo an toàn luồng ở cấp độ Python cho các đối tượng
memoryview.Nếu exporter là một phần của chuỗi hoặc cây các nhà cung cấp bộ đệm, có thể sử dụng hai sơ đồ chính:
Tái xuất: Mỗi thành viên của cây đóng vai trò là đối tượng xuất và đặt view->obj thành một tham chiếu mới cho chính nó.
Chuyển hướng: Yêu cầu bộ đệm được chuyển hướng đến đối tượng gốc của cây. Ở đây, view->obj sẽ là một tham chiếu mới cho đối tượng gốc.
Các trường riêng lẻ của view được mô tả trong phần Buffer structure, các quy tắc về cách nhà xuất khẩu phải phản ứng với các yêu cầu cụ thể có trong phần Buffer request types.
Tất cả bộ nhớ được trỏ đến trong cấu trúc
Py_bufferthuộc về nhà xuất khẩu và phải duy trì hiệu lực cho đến khi không còn người tiêu dùng nào.format,shape,strides,suboffsetsvàinternalở chế độ chỉ đọc cho người tiêu dùng.PyBuffer_FillInfo()cung cấp một cách dễ dàng để hiển thị bộ đệm byte đơn giản trong khi xử lý chính xác tất cả các loại yêu cầu.PyObject_GetBuffer()là giao diện dành cho người tiêu dùng bao bọc chức năng này.
-
releasebufferproc PyBufferProcs.bf_releasebuffer¶
The corresponding slot ID
Py_bf_releasebufferis part of the ABI ổn định kể từ phiên bản 3.11.Chữ ký của hàm này là:
khoảng trống (PyObject *exporter, Py_buffer *view);
Xử lý yêu cầu giải phóng tài nguyên của bộ đệm. Nếu không cần giải phóng tài nguyên,
PyBufferProcs.bf_releasebuffercó thể làNULL. Nếu không, việc triển khai tiêu chuẩn chức năng này sẽ thực hiện các bước tùy chọn sau:Giảm bộ đếm nội bộ cho số lượng xuất khẩu.
Nếu bộ đếm là
0, hãy giải phóng tất cả bộ nhớ liên quan đến view.
Thread safety:
Trong free-threaded build:
Việc giảm bộ đếm xuất ở bước (1) phải là nguyên tử.
Việc dọn dẹp tài nguyên khi bộ đếm về 0 phải được thực hiện một cách nguyên tử, vì bản phát hành cuối cùng có thể chạy đua với các bản phát hành đồng thời từ các luồng khác và việc phân bổ chỉ phải xảy ra một lần.
Nhà xuất khẩu MUST sử dụng trường
internalđể theo dõi các tài nguyên dành riêng cho bộ đệm. Trường này được đảm bảo không đổi, trong khi MAY tiêu dùng chuyển một bản sao của bộ đệm gốc làm đối số view.Hàm này MUST NOT giảm view->obj, vì việc đó được thực hiện tự động trong
PyBuffer_Release()(sơ đồ này rất hữu ích để phá vỡ các chu kỳ tham chiếu).PyBuffer_Release()là giao diện dành cho người tiêu dùng bao bọc chức năng này.
Cấu trúc đối tượng không đồng bộ¶
Added in version 3.5.
-
type PyAsyncMethods¶
Cấu trúc này chứa các con trỏ tới các hàm cần thiết để triển khai các đối tượng awaitable và asynchronous iterator.
Đây là định nghĩa cấu trúc:
cấu trúc typedef { unaryfunc am_await; unaryfunc am_aiter; unaryfunc am_anext; sendfunc am_send; } Phương thức PyAsync;
-
unaryfunc PyAsyncMethods.am_await¶
The corresponding slot ID
Py_am_awaitis part of the ABI ổn định kể từ phiên bản 3.5.Chữ ký của hàm này là:
PyObject *am_await(PyObject *self);
Đối tượng được trả về phải là iterator, tức là
PyIter_Check()phải trả về1cho nó.Khe này có thể được đặt thành
NULLnếu đối tượng không phải là awaitable.
-
unaryfunc PyAsyncMethods.am_aiter¶
The corresponding slot ID
Py_am_aiteris part of the ABI ổn định kể từ phiên bản 3.5.Chữ ký của hàm này là:
PyObject *am_aiter(PyObject *self);
Phải trả về một đối tượng asynchronous iterator. Xem
__anext__()để biết chi tiết.Khe này có thể được đặt thành
NULLnếu một đối tượng không triển khai giao thức lặp không đồng bộ.
-
unaryfunc PyAsyncMethods.am_anext¶
The corresponding slot ID
Py_am_anextis part of the ABI ổn định kể từ phiên bản 3.5.Chữ ký của hàm này là:
PyObject *am_anext(PyObject *self);
Phải trả về một đối tượng awaitable. Xem
__anext__()để biết chi tiết. Khe này có thể được đặt thànhNULL.
-
sendfunc PyAsyncMethods.am_send¶
The corresponding slot ID
Py_am_sendis part of the ABI ổn định kể từ phiên bản 3.10.Chữ ký của hàm này là:
PySendResult am_send(PyObject *self, PyObject *arg, PyObject **kết quả);
Xem
PyIter_Send()để biết chi tiết. Khe này có thể được đặt thànhNULL.Added in version 3.10.
Loại vị trí typedefs¶
-
typedef PyObject *(*allocfunc)(PyTypeObject *cls, Py_ssize_t nitems)¶
- Một phần của ABI ổn định.
Mục đích của chức năng này là tách việc cấp phát bộ nhớ khỏi việc khởi tạo bộ nhớ. Nó sẽ trả về một con trỏ tới một khối bộ nhớ có độ dài phù hợp cho phiên bản, được căn chỉnh phù hợp và được khởi tạo về số 0, nhưng với
ob_refcntđược đặt thành1vàob_typeđược đặt thành đối số loại. Nếutp_itemsizecủa loại khác 0 thì trườngob_sizecủa đối tượng phải được khởi tạo thành nitems và độ dài của khối bộ nhớ được phân bổ phải làtp_basicsize + nitems*tp_itemsize, được làm tròn thành bội số củasizeof(void*); mặt khác, nitems không được sử dụng và độ dài của khối phải làtp_basicsize.Hàm này không được thực hiện bất kỳ khởi tạo phiên bản nào khác, thậm chí không được phân bổ bộ nhớ bổ sung; việc đó nên được thực hiện bởi
tp_new.
-
typedef void (*destructor)(PyObject*)¶
- Một phần của ABI ổn định.
-
typedef PyObject *(*newfunc)(PyTypeObject*, PyObject*, PyObject*)¶
- Một phần của ABI ổn định.
Xem
tp_new.
-
typedef PyObject *(*reprfunc)(PyObject*)¶
- Một phần của ABI ổn định.
Xem
tp_repr.
-
typedef PyObject *(*getattrfunc)(PyObject *self, char *attr)¶
- Một phần của ABI ổn định.
Trả về giá trị của thuộc tính được đặt tên cho đối tượng.
-
typedef int (*setattrfunc)(PyObject *self, char *attr, PyObject *value)¶
- Một phần của ABI ổn định.
Đặt giá trị của thuộc tính được đặt tên cho đối tượng. Đối số giá trị được đặt thành
NULLđể xóa thuộc tính.
-
typedef PyObject *(*getattrofunc)(PyObject *self, PyObject *attr)¶
- Một phần của ABI ổn định.
Trả về giá trị của thuộc tính được đặt tên cho đối tượng.
Xem
tp_getattro.
-
typedef int (*setattrofunc)(PyObject *self, PyObject *attr, PyObject *value)¶
- Một phần của ABI ổn định.
Đặt giá trị của thuộc tính được đặt tên cho đối tượng. Đối số giá trị được đặt thành
NULLđể xóa thuộc tính.Xem
tp_setattro.
-
typedef PyObject *(*descrgetfunc)(PyObject*, PyObject*, PyObject*)¶
- Một phần của ABI ổn định.
Xem
tp_descr_get.
-
typedef int (*descrsetfunc)(PyObject*, PyObject*, PyObject*)¶
- Một phần của ABI ổn định.
Xem
tp_descr_set.
-
typedef Py_hash_t (*hashfunc)(PyObject*)¶
- Một phần của ABI ổn định.
Xem
tp_hash.
-
typedef PyObject *(*richcmpfunc)(PyObject*, PyObject*, int)¶
- Một phần của ABI ổn định.
Xem
tp_richcompare.
-
typedef PyObject *(*getiterfunc)(PyObject*)¶
- Một phần của ABI ổn định.
Xem
tp_iter.
-
typedef PyObject *(*iternextfunc)(PyObject*)¶
- Một phần của ABI ổn định.
Xem
tp_iternext.
-
typedef Py_ssize_t (*lenfunc)(PyObject*)¶
- Một phần của ABI ổn định.
-
typedef int (*getbufferproc)(PyObject*, Py_buffer*, int)¶
- Một phần của ABI ổn định kể từ phiên bản 3.12.
-
typedef void (*releasebufferproc)(PyObject*, Py_buffer*)¶
- Một phần của ABI ổn định kể từ phiên bản 3.12.
-
typedef PyObject *(*unaryfunc)(PyObject*)¶
- Một phần của ABI ổn định.
-
typedef PyObject *(*binaryfunc)(PyObject*, PyObject*)¶
- Một phần của ABI ổn định.
-
typedef PyObject *(*ssizeargfunc)(PyObject*, Py_ssize_t)¶
- Một phần của ABI ổn định.
-
typedef int (*ssizeobjargproc)(PyObject*, Py_ssize_t, PyObject*)¶
- Một phần của ABI ổn định.
-
typedef int (*objobjproc)(PyObject*, PyObject*)¶
- Một phần của ABI ổn định.
-
typedef int (*objobjargproc)(PyObject*, PyObject*, PyObject*)¶
- Một phần của ABI ổn định.
Ví dụ¶
Sau đây là những ví dụ đơn giản về định nghĩa kiểu Python. Chúng bao gồm cách sử dụng phổ biến mà bạn có thể gặp phải. Một số chứng minh các trường hợp góc khó. Để biết thêm ví dụ, thông tin thực tế và hướng dẫn, hãy xem Xác định các loại tiện ích mở rộng: Hướng dẫn và Xác định các loại tiện ích mở rộng: Các chủ đề khác nhau.
Một static type cơ bản:
cấu trúc typedef {
PyObject_HEAD
const char *dữ liệu;
} MyObject;
PyTypeObject tĩnh MyObject_Type = {
PyVarObject_HEAD_INIT(NULL, 0)
.tp_name = "mymod.MyObject",
.tp_basicsize = sizeof(MyObject),
.tp_doc = PyDoc_STR("Đối tượng của tôi"),
.tp_new = myobj_new,
.tp_dealloc = (hàm hủy)myobj_dealloc,
.tp_repr = (reprfunc)myobj_repr,
};
Bạn cũng có thể tìm thấy mã cũ hơn (đặc biệt là trong cơ sở mã CPython) với trình khởi tạo chi tiết hơn
PyTypeObject tĩnh MyObject_Type = {
PyVarObject_HEAD_INIT(NULL, 0)
"mymod.MyObject", /* tp_name */
sizeof(MyObject), /* tp_basicsize */
0, /* tp_itemsize */
(hàm hủy)myobj_dealloc, /* tp_dealloc */
0, /* tp_vectorcall_offset */
0, /*tp_getattr */
0, /*tp_setattr */
0, /* tp_as_async */
(reprfunc)myobj_repr, /* tp_repr */
0, /* tp_as_number */
0, /* tp_as_sequence */
0, /* tp_as_mapping */
0, /* tp_hash */
0, /* tp_call */
0, /*tp_str */
0, /*tp_getattro */
0, /*tp_setattro */
0, /* tp_as_buffer */
0, /* tp_flags */
PyDoc_STR("Đối tượng của tôi"), /* tp_doc */
0, /* tp_traverse */
0, /* tp_clear */
0, /* tp_richcompare */
0, /* tp_weaklistoffset */
0, /*tp_iter */
0, /* tp_iternext */
0, /* tp_methods */
0, /* tp_members */
0, /*tp_getset */
0, /*tp_base */
0, /*tp_dict */
0, /* tp_descr_get */
0, /* tp_descr_set */
0, /* tp_dictoffset */
0, /*tp_init */
0, /* tp_alloc */
myobj_new, /* tp_new */
};
Một loại hỗ trợ các điểm yếu, ký tự phiên bản và hàm băm
cấu trúc typedef {
PyObject_HEAD
const char *dữ liệu;
} MyObject;
PyTypeObject tĩnh MyObject_Type = {
PyVarObject_HEAD_INIT(NULL, 0)
.tp_name = "mymod.MyObject",
.tp_basicsize = sizeof(MyObject),
.tp_doc = PyDoc_STR("Đối tượng của tôi"),
.tp_flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE |
Py_TPFLAGS_HAVE_GC | Py_TPFLAGS_MANAGED_DICT |
Py_TPFLAGS_MANAGED_WEAKREF,
.tp_new = myobj_new,
.tp_traverse = (traverseproc)myobj_traverse,
.tp_clear = (truy vấn)myobj_clear,
.tp_alloc = PyType_GenericNew,
.tp_dealloc = (hàm hủy)myobj_dealloc,
.tp_repr = (reprfunc)myobj_repr,
.tp_hash = (hashfunc)myobj_hash,
.tp_richcompare = PyBaseObject_Type.tp_richcompare,
};
Một lớp con str không thể được phân lớp và không thể gọi để tạo các phiên bản (ví dụ: sử dụng một func xuất xưởng riêng) bằng cờ Py_TPFLAGS_DISALLOW_INSTANTIATION:
cấu trúc typedef {
PyUnicodeObject thô;
char *thêm;
} MyStr;
PyTypeObject tĩnh MyStr_Type = {
PyVarObject_HEAD_INIT(NULL, 0)
.tp_name = "mymod.MyStr",
.tp_basicsize = sizeof(MyStr),
.tp_base = NULL, // đặt thành &PyUnicode_Type trong mô-đun init
.tp_doc = PyDoc_STR("str tùy chỉnh của tôi"),
.tp_flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_DISALLOW_INSTANTIATION,
.tp_repr = (reprfunc)myobj_repr,
};
Zz000zz đơn giản nhất với các phiên bản có độ dài cố định
cấu trúc typedef {
PyObject_HEAD
} MyObject;
PyTypeObject tĩnh MyObject_Type = {
PyVarObject_HEAD_INIT(NULL, 0)
.tp_name = "mymod.MyObject",
};
Zz000zz đơn giản nhất với các phiên bản có độ dài thay đổi
cấu trúc typedef {
PyObject_VAR_HEAD
const char *data[1];
} MyObject;
PyTypeObject tĩnh MyObject_Type = {
PyVarObject_HEAD_INIT(NULL, 0)
.tp_name = "mymod.MyObject",
.tp_basicsize = sizeof(MyObject) - sizeof(char *),
.tp_itemsize = sizeof(char *),
};