Typobjektstrukturer¶
En av de kanske viktigaste strukturerna i Pythons objektsystem är den struktur som definierar en ny typ: PyTypeObject
-strukturen. Typobjekt kan hanteras med hjälp av någon av funktionerna PyObject_*
eller PyType_*
, men erbjuder inte mycket som är intressant för de flesta Python-applikationer. Dessa objekt är grundläggande för hur objekt beter sig, så de är mycket viktiga för själva tolken och för alla tilläggsmoduler som implementerar nya typer.
Typobjekt är ganska stora jämfört med de flesta standardtyperna. Anledningen till storleken är att varje typobjekt lagrar ett stort antal värden, mestadels C-funktionspekare, som var och en implementerar en liten del av typens funktionalitet. Fälten i typobjektet granskas i detalj i detta avsnitt. Fälten kommer att beskrivas i den ordning de förekommer i strukturen.
Förutom följande snabbreferens ger avsnittet Exempel en snabb inblick i betydelsen och användningen av PyTypeObject
.
Snabbreferens¶
”tp slots”¶
PyTypeObject Slot [1] |
speciella metoder/attribut |
Info [2] _ Info |
||||
---|---|---|---|---|---|---|
A |
T |
D |
I |
|||
<R> |
const char * |
__name__ |
X |
X |
||
X |
X |
X |
||||
X |
X |
|||||
X |
X |
X |
||||
X |
X |
|||||
__getattribute__, __getattr__ |
G |
|||||
__setattr__, __delattr__ |
G |
|||||
% |
||||||
__repr__ |
X |
X |
X |
|||
% |
||||||
% |
||||||
% |
||||||
__hash__ |
X |
G |
||||
__call__ |
X |
X |
||||
__str__ |
X |
X |
||||
__getattribute__, __getattr__ |
X |
X |
G |
|||
__setattr__, __delattr__ |
X |
X |
G |
|||
% |
||||||
unsigned long |
X |
X |
? |
|||
const char * |
__doc__ |
X |
X |
|||
X |
G |
|||||
X |
G |
|||||
__lt__, __le__, __eq__, __ne__, __gt__, __ge__ |
X |
G |
||||
X |
? |
|||||
__iter__ |
X |
|||||
__next__ |
X |
|||||
|
X |
X |
||||
|
X |
|||||
|
X |
X |
||||
__base__ |
X |
|||||
|
__dict__ |
? |
||||
__get__ |
X |
|||||
__set__, __delete__ |
X |
|||||
X |
? |
|||||
__init__ |
X |
X |
X |
|||
X |
? |
? |
||||
__new__ |
X |
X |
? |
? |
||
X |
X |
? |
? |
|||
X |
X |
|||||
< |
|
__bases__ |
~ |
|||
< |
|
__mro__ |
~ |
|||
[ |
|
|||||
void * |
__subclasses__ |
|||||
|
||||||
( |
||||||
unsigned int |
||||||
__del__ |
X |
|||||
unsigned char |
sub-slots¶
Slot |
särskilda metoder |
|
---|---|---|
__await__ |
||
__aiter__ |
||
__anext__ |
||
__add__ __radd__ |
||
__iadd__ |
||
__sub__ __rsub__ |
||
__isub__ |
||
__mul__ __rmul__ |
||
__imul__ |
||
__mod__ __rmod__ |
||
__imod__ |
||
__divmod__ __rdivmod__ |
||
__pow__ __rpow__ |
||
__ipow__ |
||
__neg__ |
||
__pos__ |
||
__abs__ |
||
__bool |
||
__invert__ |
||
__lshift__ __rlshift__ |
||
__ilshift__ |
||
__rshift__ __rshift__ __rshift__ |
||
__irshift__ |
||
__and__ __rand__ |
||
__iand__ |
||
__xor__ __rxor__ |
||
__ixor__ |
||
__or__ __ror__ |
||
__ior__ |
||
__int__ |
||
void * |
||
__float__ |
||
__floordiv__ |
||
__ifloordiv__ |
||
__truediv__ |
||
__itruediv__ |
||
__index__ |
||
__matmul__ __rmatmul__ |
||
__imatmul__ |
||
__len__ |
||
__getitem__ |
||
__setitem__, __delitem__ |
||
__len__ |
||
__add__ |
||
__mul__ |
||
__getitem__ |
||
__setitem__ __delitem__ |
||
__contains__ |
||
__iadd__ |
||
__imul__ |
||
__buffer__ |
||
__release_buffer__ |
slot typdefinitioner¶
typedef |
Parametertyper |
Typ av retur |
---|---|---|
|
||
|
void |
|
void * |
void |
|
int |
||
|
||
int |
||
|
|
|
PyObject *const char *
|
|
|
int |
||
|
||
int |
||
|
||
int |
||
|
Py_hash_t |
|
|
||
|
|
|
|
|
|
|
||
int |
||
void |
||
|
int |
|
PyObject * |
|
|
|
||
|
||
|
||
int |
||
int |
||
int |
Se Slotstyp typedef nedan för mer information.
PyTypeObject Definition¶
Strukturdefinitionen för PyTypeObject
finns i Include/cpython/object.h
. För att underlätta referensen upprepar detta den definition som finns där:
typedef struct _typeobject {
PyObject_VAR_HEAD
const char *tp_name; /* For printing, in format "<module>.<name>" */
Py_ssize_t tp_basicsize, tp_itemsize; /* For allocation */
/* Methods to implement standard operations */
destructor tp_dealloc;
Py_ssize_t tp_vectorcall_offset;
getattrfunc tp_getattr;
setattrfunc tp_setattr;
PyAsyncMethods *tp_as_async; /* formerly known as tp_compare (Python 2)
or tp_reserved (Python 3) */
reprfunc tp_repr;
/* Method suites for standard classes */
PyNumberMethods *tp_as_number;
PySequenceMethods *tp_as_sequence;
PyMappingMethods *tp_as_mapping;
/* More standard operations (here for binary compatibility) */
hashfunc tp_hash;
ternaryfunc tp_call;
reprfunc tp_str;
getattrofunc tp_getattro;
setattrofunc tp_setattro;
/* Functions to access object as input/output buffer */
PyBufferProcs *tp_as_buffer;
/* Flags to define presence of optional/expanded features */
unsigned long tp_flags;
const char *tp_doc; /* Documentation string */
/* Assigned meaning in release 2.0 */
/* call function for all accessible objects */
traverseproc tp_traverse;
/* delete references to contained objects */
inquiry tp_clear;
/* Assigned meaning in release 2.1 */
/* rich comparisons */
richcmpfunc tp_richcompare;
/* weak reference enabler */
Py_ssize_t tp_weaklistoffset;
/* Iterators */
getiterfunc tp_iter;
iternextfunc tp_iternext;
/* Attribute descriptor and subclassing stuff */
PyMethodDef *tp_methods;
PyMemberDef *tp_members;
PyGetSetDef *tp_getset;
// Strong reference on a heap type, borrowed reference on a static type
PyTypeObject *tp_base;
PyObject *tp_dict;
descrgetfunc tp_descr_get;
descrsetfunc tp_descr_set;
Py_ssize_t tp_dictoffset;
initproc tp_init;
allocfunc tp_alloc;
newfunc tp_new;
freefunc tp_free; /* Low-level free-memory routine */
inquiry tp_is_gc; /* For PyObject_IS_GC */
PyObject *tp_bases;
PyObject *tp_mro; /* method resolution order */
PyObject *tp_cache; /* no longer used */
void *tp_subclasses; /* for static builtin types this is an index */
PyObject *tp_weaklist; /* not used for static builtin types */
destructor tp_del;
/* Type attribute cache version tag. Added in version 2.6.
* If zero, the cache is invalid and must be initialized.
*/
unsigned int tp_version_tag;
destructor tp_finalize;
vectorcallfunc tp_vectorcall;
/* bitset of which type-watchers care about this type */
unsigned char tp_watched;
/* Number of tp_version_tag values used.
* Set to _Py_ATTR_CACHE_UNUSED if the attribute cache is
* disabled for this type (e.g. due to custom MRO entries).
* Otherwise, limited to MAX_VERSIONS_PER_CLASS (defined elsewhere).
*/
uint16_t tp_versions_used;
} PyTypeObject;
PyObject Slots¶
Typobjektstrukturen utökar PyVarObject
-strukturen. Fältet ob_size
används för dynamiska typer (skapade av type_new()
, som vanligtvis anropas från en class statement). Observera att PyType_Type
(metatypen) initialiserar tp_itemsize
, vilket innebär att dess instanser (dvs. typobjekt) måste ha fältet ob_size
.
Typobjektets referensantal initialiseras till
1
av makrotPyObject_HEAD_INIT
. Observera att för statiskt allokerade typobjekt räknas typens instanser (objekt varsob_type
pekar tillbaka på typen) inte som referenser. Men för dynamiskt allokerade typobjekt räknas förekomsterna som referenser.Arv:
Detta fält ärvs inte av subtyper.
Detta är typens typ, med andra ord dess metatyp. Den initialiseras av argumentet till makrot
PyObject_HEAD_INIT
, och dess värde bör normalt vara&PyType_Type
. Men för dynamiskt laddningsbara tilläggsmoduler som måste kunna användas på Windows (åtminstone), klagar kompilatorn på att detta inte är en giltig initierare. Därför är konventionen att skickaNULL
till makrotPyObject_HEAD_INIT
och att initiera detta fält explicit i början av modulens initialiseringsfunktion, innan något annat görs. Detta görs typiskt så här:Foo_Type.ob_type = &PyType_Type;Detta bör göras innan några instanser av typen skapas.
PyType_Ready()
kontrollerar omob_type
ärNULL
, och initialiserar det i så fall till fältetob_type
i basklassen.PyType_Ready()
ändrar inte detta fält om det är icke-noll.Arv:
Detta fält ärvs av subtyperna.
PyVarObject platser¶
För statiskt allokerade objekttyper bör detta initialiseras till noll. För dynamiskt allokerade objekttyper har detta fält en speciell intern betydelse.
Detta fält bör nås med hjälp av makrot
Py_SIZE()
.Arv:
Detta fält ärvs inte av subtyper.
PyTypeObject platser¶
Varje slot har ett avsnitt som beskriver nedärvning. Om PyType_Ready()
kan sätta ett värde när fältet är satt till NULL
så kommer det också att finnas en ”Default” sektion. (Observera att många fält som anges i PyBaseObject_Type
och PyType_Type
fungerar som standardvärden)
-
const char *PyTypeObject.tp_name¶
Pekare till en NUL-avslutad sträng som innehåller typens namn. För typer som är tillgängliga som modulglobaler ska strängen vara det fullständiga modulnamnet, följt av en punkt, följt av typnamnet; för inbyggda typer ska det bara vara typnamnet. Om modulen är en undermodul till ett paket ingår det fullständiga paketnamnet i det fullständiga modulnamnet. Till exempel, en typ med namnet
T
definierad i modulM
i underpaketQ
i paketP
bör hatp_name
initialiseraren"P.Q.M.T"
.För dynamiskt allokerade objekttyper bör detta bara vara typnamnet och modulnamnet explicit lagrat i typdiktningen som värdet för nyckeln
'__module__'
.För statiskt allokerade objekttyper ska fältet tp_name innehålla en punkt. Allt före den sista punkten görs tillgängligt som attributet
__module__
och allt efter den sista punkten görs tillgängligt som attributet__name__
.Om ingen punkt finns, görs hela fältet
tp_name
tillgängligt som attributet__name__
, och attributet__module__
är odefinierat (om det inte uttryckligen har angetts i ordlistan, enligt vad som förklaras ovan). Detta innebär att din typ inte kommer att kunna plockas. Dessutom kommer den inte att listas i moduldokumentationer som skapats med pydoc.Detta fält får inte vara
NULL
. Det är det enda obligatoriska fältet iPyTypeObject()
(förutom eventuellttp_itemsize
).Arv:
Detta fält ärvs inte av subtyper.
-
Py_ssize_t PyTypeObject.tp_basicsize¶
-
Py_ssize_t PyTypeObject.tp_itemsize¶
Dessa fält gör det möjligt att beräkna storleken i bytes för instanser av typen.
Det finns två typer av typer: typer med instanser med fast längd har fältet
tp_itemsize
som är noll, medan typer med instanser med variabel längd har fältettp_itemsize
som inte är noll. För en typ med instanser med fast längd har alla instanser samma storlek, angiven itp_basicsize
. (Undantag från denna regel kan göras med hjälp avPyUnstable_Object_GC_NewWithExtraData()
)För en typ med instanser med variabel längd måste instanserna ha ett fält
ob_size
, och instansstorleken ärtp_basicsize
plus N gångertp_itemsize
, där N är objektets ”längd”.Funktioner som
PyObject_NewVar()
tar värdet av N som ett argument och lagrar det i instansensob_size
-fält. Observera att fältetob_size
senare kan användas för andra ändamål. Exempelvis använder instanser avint
bitarna iob_size
på ett implementationsdefinierat sätt; den underliggande lagringen och dess storlek bör nås med hjälp avPyLong_Export()
.Anteckning
Fältet
ob_size
bör nås med hjälp av makronaPy_SIZE()
ochPy_SET_SIZE()
.Att det finns ett fält
ob_size
i instanslayouten betyder inte heller att instansstrukturen har variabel längd. Till exempel har typenlist
instanser med fast längd, men dessa instanser har ändå ett fältob_size
. (Precis som medint
bör du undvika att läsa listorsob_size
direkt. AnropaPyList_Size()
istället)I
tp_basicsize
ingår den storlek som behövs för data i typenstp_base
, plus eventuella extra data som behövs för varje instans.Det korrekta sättet att ange
tp_basicsize
är att använda operatornsizeof
på den struct som används för att deklarera instanslayouten. Denna struct måste inkludera den struct som används för att deklarera bastypen. Med andra ord måstetp_basicsize
vara större än eller lika med basenstp_basicsize
.Eftersom varje typ är en subtyp av
object
måste denna struktur innehållaPyObject
ellerPyVarObject
(beroende på omob_size
ska ingå). Dessa definieras vanligtvis av makrotPyObject_HEAD
respektivePyObject_VAR_HEAD
.Grundstorleken inkluderar inte storleken på GC-huvudet, eftersom det huvudet inte ingår i
PyObject_HEAD
.För fall där struct som används för att deklarera bastypen är okänd, se
PyType_Spec.basicsize
ochPyType_FromMetaclass()
.Anmärkningar om anpassning:
tp_basicsize
måste vara en multipel av_Alignof(PyObject)
. När du användersizeof
på enstruct
som innehållerPyObject_HEAD
, som rekommenderat, säkerställer kompilatorn detta. Om du inte använder en C-struktur, eller om du använder kompilatortillägg som__attribute__((packed))
, är det upp till dig.Om de variabla objekten kräver en viss inriktning måste
tp_basicsize
ochtp_itemsize
var och en vara en multipel av den inriktningen. Om t.ex. en variabeldel av en typ lagrar endouble
, är det ditt ansvar att båda fälten är en multipel av_Alignof(double)
.
Arv:
Dessa fält ärvs separat av subtyperna. (Det vill säga, om fältet är satt till noll kommer
PyType_Ready()
att kopiera värdet från bastypen, vilket indikerar att instanserna inte behöver ytterligare lagring)Om bastypen har ett icke-nollvärde för
tp_itemsize
är det i allmänhet inte säkert att angetp_itemsize
till ett annat icke-nollvärde i en subtyp (detta beror dock på implementeringen av bastypen).
-
destructor PyTypeObject.tp_dealloc¶
En pekare till instansens destruktorfunktion. Funktionens signatur är:
void tp_dealloc(PyObject *self);
Destruktorfunktionen ska ta bort alla referenser som instansen äger (t.ex. anropa
Py_CLEAR()
), frigöra alla minnesbuffertar som instansen äger och anropa typenstp_free
-funktion för att frigöra själva objektet.Om du kan anropa funktioner som kan ställa in felindikatorn måste du använda
PyErr_GetRaisedException()
ochPyErr_SetRaisedException()
för att säkerställa att du inte slår ut en redan existerande felindikator (deallokeringen kan ha inträffat under behandlingen av ett annat fel):static void foo_dealloc(foo_object *self) { PyObject *et, *ev, *etb; PyObject *exc = PyErr_GetRaisedException(); ... PyErr_SetRaisedException(exc); }
Själva dealloc-hanteraren får inte ge upphov till ett undantag; om den stöter på ett felfall bör den anropa
PyErr_FormatUnraisable()
för att logga (och rensa) ett undantag som inte går att radera.Det finns inga garantier för när ett objekt förstörs, förutom:
Python kommer att förstöra ett objekt omedelbart eller en tid efter att den sista referensen till objektet har tagits bort, såvida inte dess finalizer (
tp_finalize
) därefter återupplivar objektet.Ett objekt kommer inte att förstöras medan det automatiskt slutförs (
tp_finalize
) eller automatiskt rensas (tp_clear
).
CPython förstör för närvarande ett objekt omedelbart från
Py_DECREF()
när det nya referensantalet är noll, men detta kan ändras i en framtida version.Det rekommenderas att anropa
PyObject_CallFinalizerFromDealloc()
i början avtp_dealloc
för att garantera att objektet alltid är finalized innan det förstörs.Om typen stödjer garbage collection (flaggan
Py_TPFLAGS_HAVE_GC
är satt) ska destruktorn anropaPyObject_GC_UnTrack()
innan den rensar några medlemsfält.Det är tillåtet att anropa
tp_clear
fråntp_dealloc
för att minska koddubblering och för att garantera att objektet alltid rensas innan det förstörs. Tänk på atttp_clear
redan kan ha anropats.Om typen är heap-allokerad (
Py_TPFLAGS_HEAPTYPE
), bör deallokatorn släppa den ägda referensen till sitt typobjekt (viaPy_DECREF()
) efter anropet till typdeallokatorn. Se exempelkoden nedan.:statiskt void foo_dealloc(PyObject *op) { foo_object *self = (foo_object *) op; PyObject_GC_UnTrack(self); Py_CLEAR(själv>ref); Py_TYPE(self)->tp_free(self); }
tp_dealloc
måste lämna undantagsstatusen oförändrad. Om den behöver anropa något som kan ge upphov till ett undantag, måste undantagstillståndet först säkerhetskopieras och återställas senare (efter loggning av eventuella undantag medPyErr_WriteUnraisable()
).Exempel:
static void foo_dealloc(PyObject *self) { PyObject *exc = PyErr_GetRaisedException(); if (PyObject_CallFinalizerFromDealloc(self) < 0) { // self was resurrected. goto done; } PyTypeObject *tp = Py_TYPE(self); if (tp->tp_flags & Py_TPFLAGS_HAVE_GC) { PyObject_GC_UnTrack(self); } // Optional, but convenient to avoid code duplication. if (tp->tp_clear && tp->tp_clear(self) < 0) { PyErr_WriteUnraisable(self); } // Any additional destruction goes here. tp->tp_free(self); self = NULL; // In case PyErr_WriteUnraisable() is called below. if (tp->tp_flags & Py_TPFLAGS_HEAPTYPE) { Py_CLEAR(tp); } done: // Optional, if something was called that might have raised an // exception. if (PyErr_Occurred()) { PyErr_WriteUnraisable(self); } PyErr_SetRaisedException(exc); }
tp_dealloc
kan anropas från vilken Python-tråd som helst, inte bara den tråd som skapade objektet (om objektet blir en del av en refcount-cykel kan den cykeln samlas in av en garbage collection på vilken tråd som helst). Detta är inte ett problem för Python API-anrop, eftersom den tråd somtp_dealloc
anropas från har en attached thread state. Men om objektet som förstörs i sin tur förstör objekt från något annat C-bibliotek, bör man se till att förstörelsen av dessa objekt i den tråd som anropadetp_dealloc
inte bryter mot några antaganden i biblioteket.Arv:
Detta fält ärvs av subtyperna.
Se även
Objektets livscykel för detaljer om hur denna slot förhåller sig till andra slots.
-
Py_ssize_t PyTypeObject.tp_vectorcall_offset¶
En valfri offset till en funktion per instans som implementerar anrop av objektet med hjälp av vectorcall-protokollet, ett effektivare alternativ till den enklare
tp_call
.Detta fält används endast om flaggan
Py_TPFLAGS_HAVE_VECTORCALL
är satt. Om så är fallet måste detta vara ett positivt heltal som innehåller offset i instansen för en pekare av typenvectorcallfunc
.Poängaren vectorcallfunc kan vara
NULL
, i vilket fall instansen beter sig som omPy_TPFLAGS_HAVE_VECTORCALL
inte var inställd: anrop av instansen faller tillbaka tilltp_call
.Alla klasser som ställer in
Py_TPFLAGS_HAVE_VECTORCALL
måste också ställa intp_call
och se till att dess beteende är förenligt med funktionen vectorcallfunc. Detta kan göras genom att ställa in tp_call tillPyVectorcall_Call()
.Ändrad i version 3.8: Före version 3.8 hette denna slot
tp_print
. I Python 2.x användes den för utskrift till en fil. I Python 3.0 till 3.7 var den oanvänd.Ändrad i version 3.12: Före version 3.12 var det inte rekommenderat för mutable heap types att implementera vectorcall-protokollet. När en användare ställer in
__call__
i Python-kod, uppdateras endast tp_call, vilket sannolikt gör den inkonsekvent med vectorcall-funktionen. Sedan 3.12 kommer inställningen__call__
att inaktivera vectorcall-optimering genom att rensa flagganPy_TPFLAGS_HAVE_VECTORCALL
.Arv:
Detta fält är alltid ärftligt. Dock är
Py_TPFLAGS_HAVE_VECTORCALL
flaggan inte alltid ärvd. Om den inte är satt, kommer subklassen inte att använda vectorcall, förutom närPyVectorcall_Call()
explicit anropas.
-
getattrfunc PyTypeObject.tp_getattr¶
En valfri pekare till funktionen get-attribute-string.
Detta fält är föråldrat. När det definieras bör det peka på en funktion som fungerar på samma sätt som
tp_getattro
-funktionen, men som tar en C-sträng istället för ett Python-strängobjekt för att ge attributnamnet.Arv:
Grupp:
tp_getattr
,tp_getattro
Detta fält ärvs av subtyper tillsammans med
tp_getattro
: en subtyp ärver bådetp_getattr
ochtp_getattro
från sin bastyp när subtypenstp_getattr
ochtp_getattro
båda ärNULL
.
-
setattrfunc PyTypeObject.tp_setattr¶
En valfri pekare till funktionen för att ställa in och ta bort attribut.
Detta fält är föråldrat. När det definieras bör det peka på en funktion som fungerar på samma sätt som
tp_setattro
-funktionen, men som tar en C-sträng istället för ett Python-strängobjekt för att ge attributnamnet.Arv:
Grupp:
tp_setattr
,tp_setattro
Detta fält ärvs av subtyper tillsammans med
tp_setattro
: en subtyp ärver bådetp_setattr
ochtp_setattro
från sin bastyp när subtypenstp_setattr
ochtp_setattro
båda ärNULL
.
-
PyAsyncMethods *PyTypeObject.tp_as_async¶
Pekare till en ytterligare struktur som innehåller fält som endast är relevanta för objekt som implementerar protokollen awaitable och asynchronous iterator på C-nivå. Se Strukturer för asynkrona objekt för detaljer.
Tillagd i version 3.5: Tidigare känd som
tp_compare
ochtp_reserved
.Arv:
Fältet
tp_as_async
ärvs inte, men de ingående fälten ärvs individuellt.
-
reprfunc PyTypeObject.tp_repr¶
En valfri pekare till en funktion som implementerar den inbyggda funktionen
repr()
.Signaturen är densamma som för
PyObject_Repr()
:PyObject *tp_repr(PyObject *self);
Funktionen måste returnera en sträng eller ett Unicode-objekt. Helst ska denna funktion returnera en sträng som, när den skickas till
eval()
, i en lämplig miljö, returnerar ett objekt med samma värde. Om detta inte är möjligt, bör den returnera en sträng som börjar med'<'
och slutar med'>'
från vilken både typen och värdet på objektet kan härledas.Arv:
Detta fält ärvs av subtyperna.
Standard:
Om detta fält inte är inställt returneras en sträng av formen
<%s object at %p>
, där%s
ersätts av typnamnet och%p
av objektets minnesadress.
-
PyNumberMethods *PyTypeObject.tp_as_number¶
Pekare till en ytterligare struktur som innehåller fält som endast är relevanta för objekt som implementerar nummerprotokollet. Dessa fält är dokumenterade i Strukturer för nummerobjekt.
Arv:
Fältet
tp_as_number
ärvs inte, men de ingående fälten ärvs individuellt.
-
PySequenceMethods *PyTypeObject.tp_as_sequence¶
Pekare till en ytterligare struktur som innehåller fält som endast är relevanta för objekt som implementerar sekvensprotokollet. Dessa fält är dokumenterade i Strukturer för sekvensobjekt.
Arv:
Fältet
tp_as_sequence
ärvs inte, men de ingående fälten ärvs individuellt.
-
PyMappingMethods *PyTypeObject.tp_as_mapping¶
Pekare till en ytterligare struktur som innehåller fält som endast är relevanta för objekt som implementerar mappningsprotokollet. Dessa fält är dokumenterade i Mappning av objektstrukturer.
Arv:
Fältet
tp_as_mapping
ärvs inte, men de ingående fälten ärvs individuellt.
-
hashfunc PyTypeObject.tp_hash¶
En valfri pekare till en funktion som implementerar den inbyggda funktionen
hash()
.Signaturen är densamma som för
PyObject_Hash()
:Py_hash_t tp_hash(PyObject *);
Värdet
-1
ska inte returneras som ett normalt returvärde; när ett fel inträffar under beräkningen av hashvärdet ska funktionen sätta ett undantag och returnera-1
.När detta fält inte är inställt (och
tp_richcompare
inte är inställt), kommer ett försök att ta objektets hash att ge upphov tillTypeError
. Detta är samma sak som att sätta den tillPyObject_HashNotImplemented()
.Detta fält kan explicit sättas till
PyObject_HashNotImplemented()
för att blockera arv av hash-metoden från en överordnad typ. Detta tolkas som motsvarigheten till__hash__ = None
på Python-nivå, vilket gör attisinstance(o, collections.Hashable)
korrekt returnerarFalse
. Observera att det omvända också är sant - att sätta__hash__ = None
på en klass på Python-nivå kommer att resultera i atttp_hash
slot sätts tillPyObject_HashNotImplemented()
.Arv:
Grupp:
tp_hash
,tp_richcompare
Detta fält ärvs av subtyper tillsammans med
tp_richcompare
: en subtyp ärver bådetp_richcompare
ochtp_hash
, när subtypenstp_richcompare
ochtp_hash
båda ärNULL
.Standard:
PyBaseObject_Type
använderPyObject_GenericHash()
.
-
ternaryfunc PyTypeObject.tp_call¶
En valfri pekare till en funktion som implementerar anrop av objektet. Denna bör vara
NULL
om objektet inte är anropsbart. Signaturen är densamma som förPyObject_Call()
:PyObject *tp_call(PyObject *self, PyObject *args, PyObject *kwargs);
Arv:
Detta fält ärvs av subtyperna.
-
reprfunc PyTypeObject.tp_str¶
En valfri pekare till en funktion som implementerar den inbyggda operationen
str()
. (Observera attstr
nu är en typ och attstr()
anropar konstruktören för den typen. Denna konstruktör anroparPyObject_Str()
för att göra det faktiska arbetet, ochPyObject_Str()
kommer att anropa denna hanterare)Signaturen är densamma som för
PyObject_Str()
:PyObject *tp_str(PyObject *self);
Funktionen måste returnera en sträng eller ett Unicode-objekt. Det bör vara en ”vänlig” strängrepresentation av objektet, eftersom det är den representation som kommer att användas, bland annat, av funktionen
print()
.Arv:
Detta fält ärvs av subtyperna.
Standard:
När detta fält inte är inställt anropas
PyObject_Repr()
för att returnera en strängrepresentation.
-
getattrofunc PyTypeObject.tp_getattro¶
En valfri pekare till funktionen get-attribute.
Signaturen är densamma som för
PyObject_GetAttr()
:PyObject *tp_getattro(PyObject *self, PyObject *attr);
Det är oftast lämpligt att ställa in detta fält till
PyObject_GenericGetAttr()
, som implementerar det normala sättet att leta efter objektattribut.Arv:
Grupp:
tp_getattr
,tp_getattro
Detta fält ärvs av subtyper tillsammans med
tp_getattr
: en subtyp ärver bådetp_getattr
ochtp_getattro
från sin bastyp när subtypenstp_getattr
ochtp_getattro
båda ärNULL
.Standard:
PyBaseObject_Type
använderPyObject_GenericGetAttr()
.
-
setattrofunc PyTypeObject.tp_setattro¶
En valfri pekare till funktionen för att ställa in och ta bort attribut.
Signaturen är densamma som för
PyObject_SetAttr()
:int tp_setattro(PyObject *self, PyObject *attr, PyObject *value);
Dessutom måste det finnas stöd för att sätta value till
NULL
för att ta bort ett attribut. Det är vanligtvis bekvämt att ställa in detta fält tillPyObject_GenericSetAttr()
, som implementerar det normala sättet att ställa in objektattribut.Arv:
Grupp:
tp_setattr
,tp_setattro
Detta fält ärvs av subtyper tillsammans med
tp_setattr
: en subtyp ärver bådetp_setattr
ochtp_setattro
från sin bastyp när subtypenstp_setattr
ochtp_setattro
båda ärNULL
.Standard:
PyBaseObject_Type
använderPyObject_GenericSetAttr()
.
-
PyBufferProcs *PyTypeObject.tp_as_buffer¶
Pekare till en ytterligare struktur som innehåller fält som endast är relevanta för objekt som implementerar buffertgränssnittet. Dessa fält är dokumenterade i Strukturer för buffertobjekt.
Arv:
Fältet
tp_as_buffer
ärvs inte, men de ingående fälten ärvs individuellt.
-
unsigned long PyTypeObject.tp_flags¶
Detta fält är en bitmask med olika flaggor. Vissa flaggor anger varierande semantik för vissa situationer; andra används för att ange att vissa fält i typobjektet (eller i de tilläggsstrukturer som refereras via
tp_as_number
,tp_as_sequence
,tp_as_mapping
, ochtp_as_buffer
) som historiskt sett inte alltid funnits är giltiga; om en sådan flaggbit är klar får de typfält som den skyddar inte nås och måste anses ha värdet noll ellerNULL
istället.Arv:
Nedärvningen av detta fält är komplicerad. De flesta flaggbitar ärvs individuellt, dvs. om bastypen har en flaggbit inställd ärver subtypen denna flaggbit. De flaggbitar som hör till tilläggsstrukturer ärvs strikt om tilläggsstrukturen ärvs, d.v.s. bastypens värde på flaggbiten kopieras till subtypen tillsammans med en pekare till tilläggsstrukturen. Flaggbiten
Py_TPFLAGS_HAVE_GC
ärvs tillsammans med fältentp_traverse
ochtp_clear
, dvs. om flaggbitenPy_TPFLAGS_HAVE_GC
är klar i subtypen och fältentp_traverse
ochtp_clear
i subtypen finns och har värdenaNULL
.Standard:
PyBaseObject_Type
använderPy_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE
.Bitmasker:
Följande bitmasker är för närvarande definierade; dessa kan kombineras med operatorn
|
för att bilda värdet i fältettp_flags
. MakrotPyType_HasFeature()
tar en typ och ett flaggvärde, tp och f, och kontrollerar omtp->tp_flags & f
är icke-noll.-
Py_TPFLAGS_HEAPTYPE¶
Denna bit är inställd när själva typobjektet allokeras på heapen, t.ex. typer som skapas dynamiskt med
PyType_FromSpec()
. I detta fall betraktas fältetob_type
i dess instanser som en referens till typen, och typobjektet INCREF’ed när en ny instans skapas, och DECREF’ed när en instans förstörs (detta gäller inte instanser av subtyper; endast den typ som instansens ob_type refererar till INCREF’ed eller DECREF’ed). Heap-typer bör också stödja garbage collection eftersom de kan bilda en referenscykel med sitt eget modulobjekt.Arv:
???
-
Py_TPFLAGS_BASETYPE¶
Denna bit är satt när typen kan användas som bastyp för en annan typ. Om denna bit är klar kan typen inte subtypas (på samma sätt som en ”final”-klass i Java).
Arv:
???
-
Py_TPFLAGS_READY¶
Denna bit är inställd när typobjektet har initialiserats fullständigt av
PyType_Ready()
.Arv:
???
-
Py_TPFLAGS_READYING¶
Denna bit är inställd när
PyType_Ready()
håller på att initiera typobjektet.Arv:
???
-
Py_TPFLAGS_HAVE_GC¶
Denna bit är inställd när objektet stöder garbage collection. Om denna bit är inställd måste minne för nya instanser (se
tp_alloc
) allokeras medPyObject_GC_New
ellerPyType_GenericAlloc()
och avallokeras (setp_free
) medPyObject_GC_Del()
. Mer information finns i avsnitt Stöd för cyklisk skräpinsamling.Arv:
Grupp:
Py_TPFLAGS_HAVE_GC
,tp_traverse
,tp_clear
Flaggbiten
Py_TPFLAGS_HAVE_GC
ärvs tillsammans med fältentp_traverse
ochtp_clear
, dvs. om flaggbitenPy_TPFLAGS_HAVE_GC
är klar i subtypen och fältentp_traverse
ochtp_clear
i subtypen finns och har värdenaNULL
.
-
Py_TPFLAGS_DEFAULT¶
Detta är en bitmask med alla de bitar som rör förekomsten av vissa fält i typobjektet och dess tilläggsstrukturer. För närvarande innehåller den följande bitar:
Py_TPFLAGS_HAVE_STACKLESS_EXTENSION
.Arv:
???
-
Py_TPFLAGS_METHOD_DESCRIPTOR¶
Denna bit indikerar att objekt beter sig som obundna metoder.
Om denna flagga är inställd för
type(meth)
, då:meth.__get__(obj, cls)(*args, **kwds)
(medobj
inte None) måste vara likvärdig medmeth(obj, *args, **kwds)
.meth.__get__(None, cls)(*args, **kwds)
måste vara likvärdig medmeth(*args, **kwds)
.
Denna flagga möjliggör en optimering för typiska metodanrop som
obj.meth()
: den undviker att skapa ett tillfälligt ”bound method”-objekt förobj.meth
.Tillagd i version 3.8.
Arv:
Denna flagga ärvs aldrig av typer som inte har flaggan
Py_TPFLAGS_IMMUTABLETYPE
inställd. För tilläggstyper ärvs den närhelsttp_descr_get
ärvs.
-
Py_TPFLAGS_MANAGED_DICT¶
Denna bit anger att instanser av klassen har attributet
__dict__
och att utrymmet för ordlistan hanteras av den virtuella datorn.Om denna flagga är satt, bör
Py_TPFLAGS_HAVE_GC
också vara satt.Typövergångsfunktionen måste anropa
PyObject_VisitManagedDict()
och dess rensningsfunktion måste anropaPyObject_ClearManagedDict()
.Tillagd i version 3.12.
Arv:
Denna flagga ärvs om inte fältet
tp_dictoffset
är inställt i en superklass.
-
Py_TPFLAGS_MANAGED_WEAKREF¶
Denna bit anger att instanser av klassen ska vara svagt refererbara.
Tillagd i version 3.12.
Arv:
Denna flagga ärvs om inte fältet
tp_weaklistoffset
är inställt i en superklass.
-
Py_TPFLAGS_ITEMS_AT_END¶
Används endast med typer med variabel storlek, dvs. sådana som har
tp_itemsize
som inte är noll.Indikerar att den variabelstora delen av en instans av denna typ är i slutet av instansens minnesområde, vid en offset av
Py_TYPE(obj)->tp_basicsize
(som kan vara annorlunda i varje underklass).När du ställer in denna flagga måste du se till att alla superklasser antingen använder denna minneslayout eller inte har variabel storlek. Python kontrollerar inte detta.
Tillagd i version 3.12.
Arv:
Denna flagga ärvs.
-
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¶
Dessa flaggor används av funktioner som
PyLong_Check()
för att snabbt avgöra om en typ är en underklass av en inbyggd typ; sådana specifika kontroller är snabbare än en generisk kontroll, somPyObject_IsInstance()
. Anpassade typer som ärver från inbyggda typer bör ha sinatp_flags
inställda på lämpligt sätt, annars kommer koden som interagerar med sådana typer att bete sig annorlunda beroende på vilken typ av kontroll som används.
-
Py_TPFLAGS_HAVE_FINALIZE¶
Denna bit är inställd när
tp_finalize
finns i typstrukturen.Tillagd i version 3.4.
Föråldrad sedan version 3.8: Denna flagga är inte längre nödvändig, eftersom tolken antar att
tp_finalize
alltid finns i typstrukturen.
-
Py_TPFLAGS_HAVE_VECTORCALL¶
Denna bit är inställd när klassen implementerar vectorcall-protokollet. Se
tp_vectorcall_offset
för detaljer.Arv:
Denna bit ärvs om
tp_call
också ärvs.Tillagd i version 3.9.
Ändrad i version 3.12: Denna flagga tas nu bort från en klass när klassens
__call__()
-metod tilldelas på nytt.Denna flagga kan nu ärvas av mutabla klasser.
-
Py_TPFLAGS_IMMUTABLETYPE¶
Denna bit är inställd för typobjekt som är oföränderliga: typattribut kan inte ställas in eller tas bort.
PyType_Ready()
tillämpar automatiskt denna flagga på static types.Arv:
Denna flagga är inte ärftlig.
Tillagd i version 3.10.
-
Py_TPFLAGS_DISALLOW_INSTANTIATION¶
Tillåt inte att skapa instanser av typen: sätt
tp_new
till NULL och skapa inte nyckeln__new__
i typordboken.Flaggan måste anges innan typen skapas, inte efteråt. Den måste till exempel ställas in innan
PyType_Ready()
anropas på typen.Flaggan sätts automatiskt på static types om
tp_base
är NULL eller&PyBaseObject_Type
ochtp_new
är NULL.Arv:
Denna flagga ärvs inte. Underklasser kommer dock inte att kunna instansieras om de inte tillhandahåller en icke-NULL
tp_new
(vilket endast är möjligt via C API).Anteckning
Använd inte denna flagga för att inte tillåta instansiering av en klass direkt men tillåta instansiering av dess underklasser (t.ex. för en abstrakt basklass). Gör istället så att
tp_new
bara lyckas för underklasser.Tillagd i version 3.10.
-
Py_TPFLAGS_MAPPING¶
Denna bit indikerar att instanser av klassen kan matcha mappningsmönster när de används som ämne för ett
match
-block. Den sätts automatiskt vid registrering eller underklassning avcollections.abc.Mapping
, och avmarkeras vid registrering avcollections.abc.Sequence
.Anteckning
Py_TPFLAGS_MAPPING
ochPy_TPFLAGS_SEQUENCE
är ömsesidigt uteslutande; det är ett fel att aktivera båda flaggorna samtidigt.Arv:
Denna flagga ärvs av typer som inte redan har satt
Py_TPFLAGS_SEQUENCE
.Se även
PEP 634 – Matchning av strukturella mönster: Specifikation
Tillagd i version 3.10.
-
Py_TPFLAGS_SEQUENCE¶
Denna bit indikerar att instanser av klassen kan matcha sekvensmönster när de används som subjekt i ett
match
-block. Den sätts automatiskt vid registrering eller underklassning avcollections.abc.Sequence
, och avmarkeras vid registrering avcollections.abc.Mapping
.Anteckning
Py_TPFLAGS_MAPPING
ochPy_TPFLAGS_SEQUENCE
är ömsesidigt uteslutande; det är ett fel att aktivera båda flaggorna samtidigt.Arv:
Denna flagga ärvs av typer som inte redan har satt
Py_TPFLAGS_MAPPING
.Se även
PEP 634 – Matchning av strukturella mönster: Specifikation
Tillagd i version 3.10.
-
Py_TPFLAGS_VALID_VERSION_TAG¶
Internt. Denna flagga ska inte ställas in eller tas bort. För att indikera att en klass har ändrats anropa
PyType_Modified()
Varning
Denna flagga finns i header-filer, men används inte. Den kommer att tas bort i en framtida version av CPython
-
Py_TPFLAGS_HEAPTYPE¶
-
const char *PyTypeObject.tp_doc¶
En valfri pekare till en NUL-avslutad C-sträng som anger dokumentsträngen för detta typobjekt. Detta exponeras som attributet
__doc__
på typen och instanser av typen.Arv:
Detta fält ärvs inte av subtyper.
-
traverseproc PyTypeObject.tp_traverse¶
En valfri pekare till en traversalfunktion för skräpsamlaren. Denna används endast om flaggbiten
Py_TPFLAGS_HAVE_GC
är satt. Signaturen är:int tp_traverse(PyObject *self, visitproc visit, void *arg);
Mer information om Pythons skräpplockningssystem finns i avsnitt Stöd för cyklisk skräpinsamling.
Pekaren
tp_traverse
används av garbage collector för att upptäcka referenscykler. En typisk implementering av entp_traverse
-funktion anropar helt enkeltPy_VISIT()
på var och en av instansens medlemmar som är Python-objekt som instansen äger. Detta är till exempel funktionenlocal_traverse()
från tilläggsmodulen_thread
:static int local_traverse(PyObject *op, visitproc visit, void *arg) { localobject *self = (localobject *) op; Py_VISIT(self->args); Py_VISIT(self->kw); Py_VISIT(self->dict); return 0; }
Observera att
Py_VISIT()
endast anropas på de medlemmar som kan delta i referenscykler. Även om det också finns en medlemself->key
, kan den endast varaNULL
eller en Python-sträng och kan därför inte ingå i en referenscykel.Å andra sidan, även om du vet att en medlem aldrig kan ingå i en cykel, kan du som felsökningshjälp vilja besöka den ändå, bara för att
gc
-modulensget_referents()
-funktion ska inkludera den.Heap-typer (
Py_TPFLAGS_HEAPTYPE
) måste besöka sin typ med:Py_VISIT(Py_TYPE(self));
Den behövs bara sedan Python 3.9. För att stödja Python 3.8 och äldre måste denna rad vara villkorlig:
#if PY_VERSION_HEX >= 0x03090000 Py_VISIT(Py_TYPE(self)); #endif
Om bit
Py_TPFLAGS_MANAGED_DICT
är inställd i fältettp_flags
måste traversefunktionen anropaPyObject_VisitManagedDict()
så här:PyObject_VisitManagedDict((PyObject*)self, visit, arg);
Varning
Vid implementering av
tp_traverse
, måste endast de medlemmar som instansen äger (genom att ha strong references till dem) besökas. Om ett objekt t.ex. stöder svaga referenser viatp_weaklist
slot, får pekaren som stöder den länkade listan (som tp_weaklist pekar på) inte besökas eftersom instansen inte direkt äger de svaga referenserna till sig själv (weakreference-listan finns där för att stödja maskineriet för svaga referenser, men instansen har ingen stark referens till elementen inuti den, eftersom de får tas bort även om instansen fortfarande lever).Observera att
Py_VISIT()
kräver att parametrarna visit och arg tilllocal_traverse()
har dessa specifika namn; ge dem inte vilka namn som helst.Instanser av heap-allocated types innehåller en referens till sin typ. Deras traverseringsfunktion måste därför antingen besöka
Py_TYPE(self)
eller delegera detta ansvar genom att anropatp_traverse
för en annan heap-allokerad typ (t.ex. en heap-allokerad superklass). Om de inte gör detta kan typobjektet inte samlas in av skräpsamling.Anteckning
Funktionen
tp_traverse
kan anropas från vilken tråd som helst.Ändrad i version 3.9: Heap-allokerade typer förväntas besöka
Py_TYPE(self)
itp_traverse
. I tidigare versioner av Python, på grund av bug 40217, kan detta leda till krascher i underklasser.Arv:
Grupp:
Py_TPFLAGS_HAVE_GC
,tp_traverse
,tp_clear
Detta fält ärvs av subtyper tillsammans med
tp_clear
och flaggbitenPy_TPFLAGS_HAVE_GC
: flaggbiten,tp_traverse
ochtp_clear
ärvs alla från bastypen om de alla är noll i subtypen.
-
inquiry PyTypeObject.tp_clear¶
En valfri pekare till en tydlig funktion. Signaturen är:
int tp_clear(PyObject *);
Syftet med denna funktion är att bryta referenscykler som orsakar en cyclic isolate så att objekten kan förstöras på ett säkert sätt. Ett rensat objekt är ett delvis förstört objekt; objektet är inte skyldigt att uppfylla designinvarianter som hålls under normal användning.
tp_clear
behöver inte radera referenser till objekt som inte kan delta i referenscykler, t.ex. Python-strängar eller Python-integraler. Det kan dock vara bekvämt att rensa alla referenser och skriva typenstp_dealloc
-funktion för att anropatp_clear
för att undvika koddubblering. (Tänk på atttp_clear
kanske redan har anropats. Föredra att anropa idempotenta funktioner somPy_CLEAR()
)All icke-trivial upprensning bör utföras i
tp_finalize
istället förtp_clear
.Anteckning
Om
tp_clear
misslyckas med att bryta en referenscykel kan objekten i cyclic isolate förbli obegränsat oinsamlingsbara (”läcka”). Segc.garbage
.Anteckning
Referenser (direkta och indirekta) kan redan ha rensats; det är inte garanterat att de är i ett konsekvent tillstånd.
Anteckning
Funktionen
tp_clear
kan anropas från vilken tråd som helst.Anteckning
Det är inte garanterat att ett objekt automatiskt rensas innan dess destruktor (
tp_dealloc
) anropas.Denna funktion skiljer sig från destruktorn (
tp_dealloc
) på följande sätt:Syftet med att cleara ett objekt är att ta bort referenser till andra objekt som kan delta i en referenscykel. Destruktorns syfte är å andra sidan ett överordnat: den måste frigöra alla resurser som den äger, inklusive referenser till objekt som inte kan delta i en referenscykel (t.ex. heltal) samt objektets eget minne (genom att anropa
tp_free
).När
tp_clear
anropas kan andra objekt fortfarande ha referenser till det objekt som rensas. På grund av detta fårtp_clear
inte deallokera objektets eget minne (tp_free
). Destruktorn, å andra sidan, anropas endast när inga (starka) referenser finns, och måste därför på ett säkert sätt förstöra själva objektet genom att avallokera det.tp_clear
kanske aldrig anropas automatiskt. Ett objekts destruktor kommer däremot att anropas automatiskt en tid efter det att objektet blir oåtkomligt (dvs. antingen finns det inga referenser till objektet eller så är objektet medlem i en cyclic isolate).
Inga garantier görs om när, om eller hur ofta Python automatiskt rensar ett objekt, förutom:
Python rensar inte automatiskt ett objekt om det är nåbart, dvs. om det finns en referens till det och det inte är en medlem av en cyclic isolate.
Python kommer inte automatiskt att rensa ett objekt om det inte har blivit automatiskt finaliserat (se
tp_finalize
). (Om finaliseraren återupplivade objektet kan det hända att objektet automatiskt finaliseras igen innan det rensas)Om ett objekt är medlem i ett cyclic isolate, kommer Python inte automatiskt att rensa det om någon medlem i det cykliska isolatet ännu inte har slutförts automatiskt (
tp_finalize
).Python kommer inte att förstöra ett objekt förrän efter att alla automatiska anrop till dess
tp_clear
-funktion har returnerats. Detta säkerställer att handlingen att bryta en referenscykel inte ogiltigförklararself
-pekaren medantp_clear
fortfarande körs.Python kommer inte automatiskt att anropa
tp_clear
flera gånger samtidigt.
CPython rensar för närvarande bara automatiskt objekt när det behövs för att bryta referenscykler i en cyclic isolate, men framtida versioner kan rensa objekt regelbundet innan de förstörs.
Sammantaget måste alla
tp_clear
-funktioner i systemet kombineras för att bryta alla referenscykler. Detta är subtilt, och om du är osäker kan du använda entp_clear
-funktion. Till exempel implementerar inte tupeltypen entp_clear
-funktion, eftersom det är möjligt att bevisa att ingen referenscykel kan bestå helt av tuplar. Därför ärtp_clear
-funktioner av andra typer ansvariga för att bryta alla cykler som innehåller en tupel. Detta är inte omedelbart uppenbart, och det finns sällan en bra anledning att undvika att implementeratp_clear
.Implementeringar av
tp_clear
bör ta bort instansens referenser till de av dess medlemmar som kan vara Python-objekt, och sätta dess pekare till dessa medlemmar tillNULL
, som i följande exempel:static int local_clear(PyObject *op) { localobject *self = (localobject *) op; Py_CLEAR(self->key); Py_CLEAR(self->args); Py_CLEAR(self->kw); Py_CLEAR(self->dict); return 0; }
Makrot
Py_CLEAR()
bör användas eftersom det är känsligt att rensa referenser: referensen till det ingående objektet får inte släppas (viaPy_DECREF()
) förrän efter att pekaren till det ingående objektet har satts tillNULL
. Detta beror på att frigörandet av referensen kan leda till att det inneslutna objektet blir skräp, vilket utlöser en kedja av återvinningsaktiviteter som kan inkludera anrop av godtycklig Python-kod (på grund av finalizers eller weakref callbacks som är associerade med det inneslutna objektet). Om det är möjligt för sådan kod att referera till self igen, är det viktigt att pekaren till det inneslutna objektet ärNULL
vid den tidpunkten, så att self vet att det inneslutna objektet inte längre kan användas. MakrotPy_CLEAR()
utför dessa operationer i en säker ordning.Om bitarna
Py_TPFLAGS_MANAGED_DICT
är inställda i fältettp_flags
, måste traversefunktionen anropaPyObject_ClearManagedDict()
så här:PyObject_ClearManagedDict((PyObject*)self);
Mer information om Pythons skräpplockningssystem finns i avsnitt Stöd för cyklisk skräpinsamling.
Arv:
Grupp:
Py_TPFLAGS_HAVE_GC
,tp_traverse
,tp_clear
Detta fält ärvs av subtyper tillsammans med
tp_traverse
och flaggbitenPy_TPFLAGS_HAVE_GC
: flaggbiten,tp_traverse
ochtp_clear
ärvs alla från bastypen om de alla är noll i subtypen.Se även
Objektets livscykel för detaljer om hur denna slot förhåller sig till andra slots.
-
richcmpfunc PyTypeObject.tp_richcompare¶
En valfri pekare till den rika jämförelsefunktionen, vars signatur är:
PyObject *tp_richcompare(PyObject *self, PyObject *other, int op);
Den första parametern är garanterat en instans av den typ som definieras av
PyTypeObject
.Funktionen ska returnera resultatet av jämförelsen (vanligtvis
Py_True
ellerPy_False
). Om jämförelsen är odefinierad måste den returneraPy_NotImplemented
, om ett annat fel inträffade måste den returneraNULL
och sätta ett undantagsvillkor.Följande konstanter är definierade för att användas som det tredje argumentet för
tp_richcompare
och förPyObject_RichCompare()
:Konstant
Jämförelse
-
Py_LT¶
<
-
Py_LE¶
<=
-
Py_EQ¶
==
-
Py_NE¶
!=
-
Py_GT¶
>
-
Py_GE¶
>=
Följande makro är definierat för att underlätta skrivandet av rika jämförelsefunktioner:
-
Py_RETURN_RICHCOMPARE(VAL_A, VAL_B, op)¶
Returnerar
Py_True
ellerPy_False
från funktionen, beroende på resultatet av en jämförelse. VAL_A och VAL_B måste kunna ordnas av C:s jämförelseoperatorer (de kan t.ex. vara C:s ints eller floats). Det tredje argumentet specificerar den begärda operationen, som förPyObject_RichCompare()
.Det returnerade värdet är en ny strong reference.
Vid fel, anger ett undantag och returnerar
NULL
från funktionen.Tillagd i version 3.7.
Arv:
Grupp:
tp_hash
,tp_richcompare
Detta fält ärvs av subtyper tillsammans med
tp_hash
: en subtyp ärvertp_richcompare
ochtp_hash
när subtypenstp_richcompare
ochtp_hash
båda ärNULL
.Standard:
PyBaseObject_Type
tillhandahåller entp_richcompare
-implementation, som kan ärvas. Men om endasttp_hash
definieras, används inte ens den ärvda funktionen och instanser av typen kommer inte att kunna delta i några jämförelser.-
Py_LT¶
-
Py_ssize_t PyTypeObject.tp_weaklistoffset¶
Även om detta fält fortfarande stöds bör
Py_TPFLAGS_MANAGED_WEAKREF
användas i stället, om det är möjligt.Om instanserna av denna typ är svagt refererbara, är detta fält större än noll och innehåller offset i instansstrukturen för huvudet på listan över svaga referenser (ignorerar GC-headern, om sådan finns); denna offset används av funktionerna
PyObject_ClearWeakRefs()
ochPyWeakref_*
. Instansstrukturen måste innehålla ett fält av typen PyObject* som initialiseras tillNULL
.Förväxla inte detta fält med
tp_weaklist
; det är listhuvudet för svaga referenser till typobjektet självt.Det är ett fel att ange både
Py_TPFLAGS_MANAGED_WEAKREF
bit ochtp_weaklistoffset
.Arv:
Detta fält ärvs av subtyper, men se de regler som anges nedan. En subtyp kan åsidosätta denna offset; detta innebär att subtypen använder ett annat listhuvud för svaga referenser än bastypen. Eftersom listhuvudet alltid hittas via
tp_weaklistoffset
, bör detta inte vara något problem.Standard:
Om bitarna
Py_TPFLAGS_MANAGED_WEAKREF
är inställda i fältettp_flags
, kommertp_weaklistoffset
att sättas till ett negativt värde, för att indikera att det är osäkert att använda detta fält.
-
getiterfunc PyTypeObject.tp_iter¶
En valfri pekare till en funktion som returnerar en iterator för objektet. Dess närvaro signalerar normalt att instanser av denna typ är iterable (även om sekvenser kan vara iterabla utan denna funktion).
Denna funktion har samma signatur som
PyObject_GetIter()
:PyObject *tp_iter(PyObject *self);
Arv:
Detta fält ärvs av subtyperna.
-
iternextfunc PyTypeObject.tp_iternext¶
En valfri pekare till en funktion som returnerar nästa objekt i en iterator. Signaturen är:
PyObject *tp_iternext(PyObject *self);
När iteratorn är uttömd måste den returnera
NULL
; ettStopIteration
undantag kan eller kan inte ställas in. När ett annat fel inträffar måste den också returneraNULL
. Dess närvaro signalerar att förekomsterna av denna typ är iteratorer.Iteratortyper bör också definiera funktionen
tp_iter
, och den funktionen bör returnera själva iteratorinstansen (inte en ny iteratorinstans).Denna funktion har samma signatur som
PyIter_Next()
.Arv:
Detta fält ärvs av subtyperna.
-
struct PyMethodDef *PyTypeObject.tp_methods¶
En valfri pekare till en statisk
NULL
-terminerad array avPyMethodDef
-strukturer, som deklarerar vanliga metoder av denna typ.För varje post i matrisen läggs en post till i typens dictionary (se
tp_dict
nedan) som innehåller en metoddeskriptor.Arv:
Detta fält ärvs inte av subtyper (metoder ärvs genom en annan mekanism).
-
struct PyMemberDef *PyTypeObject.tp_members¶
En valfri pekare till en statisk
NULL
-terminerad array avPyMemberDef
-strukturer, som deklarerar vanliga datamedlemmar (fält eller slots) för instanser av denna typ.För varje post i matrisen läggs en post till i typens dictionary (se
tp_dict
nedan) som innehåller en medlemsdeskriptor.Arv:
Detta fält ärvs inte av subtyper (medlemmar ärvs genom en annan mekanism).
-
struct PyGetSetDef *PyTypeObject.tp_getset¶
En valfri pekare till en statisk
NULL
-terminerad array avPyGetSetDef
-strukturer, som deklarerar beräknade attribut för instanser av denna typ.För varje post i matrisen läggs en post till i typens dictionary (se
tp_dict
nedan) som innehåller en getset-descriptor.Arv:
Detta fält ärvs inte av subtyper (beräknade attribut ärvs genom en annan mekanism).
-
PyTypeObject *PyTypeObject.tp_base¶
En valfri pekare till en bastyp från vilken typegenskaper ärvs. På denna nivå stöds endast enkel nedärvning; multipel nedärvning kräver att ett typobjekt skapas dynamiskt genom att anropa metatypen.
Anteckning
Slotinitialisering är föremål för reglerna för initialisering av globaler. C99 kräver att initialisatorerna är ”adresskonstanter”. Funktionsbeteckningar som
PyType_GenericNew()
, med implicit konvertering till en pekare, är giltiga C99-adresskonstanter.Den unära operatorn ’&’ som används på en icke-statisk variabel som
PyBaseObject_Type
är dock inte nödvändig för att producera en adresskonstant. Kompilatorer kan stödja detta (gcc gör det), MSVC gör det inte. Båda kompilatorerna är strikt standardkonforma i detta speciella beteende.Följaktligen bör
tp_base
anges i tilläggsmodulens init-funktion.Arv:
Detta fält ärvs inte av subtyper (naturligtvis).
Standard:
Detta fält är som standard
&PyBaseObject_Type
(som för Python-programmerare är känt som typenobject
).
-
PyObject *PyTypeObject.tp_dict¶
Typens ordbok lagras här av
PyType_Ready()
.Detta fält bör normalt initialiseras till
NULL
innan PyType_Ready anropas; det kan också initialiseras till en dictionary som innehåller initiala attribut för typen. NärPyType_Ready()
har initialiserat typen kan extra attribut för typen läggas till i denna ordbok endast om de inte motsvarar överbelastade operationer (som__add__()
). När initialiseringen av typen har avslutats bör detta fält behandlas som skrivskyddat.Vissa typer kanske inte lagrar sin ordbok i denna slot. Använd
PyType_GetDict()
för att hämta ordlistan för en godtycklig typ.Ändrad i version 3.12: Intern detalj: För statiska inbyggda typer är detta alltid
NULL
. Istället lagras dict för sådana typer påPyInterpreterState
. AnvändPyType_GetDict()
för att få fram dict för en godtycklig typ.Arv:
Detta fält ärvs inte av subtyper (även om de attribut som definieras här ärvs genom en annan mekanism).
Standard:
Om detta fält är
NULL
kommerPyType_Ready()
att tilldela det en ny ordbok.Varning
Det är inte säkert att använda
PyDict_SetItem()
på eller på annat sätt modifieratp_dict
med dictionary C-API.
-
descrgetfunc PyTypeObject.tp_descr_get¶
En valfri pekare till en ”descriptor get”-funktion.
Funktionens signatur är:
PyObject * tp_descr_get(PyObject *self, PyObject *obj, PyObject *type);
Arv:
Detta fält ärvs av subtyperna.
-
descrsetfunc PyTypeObject.tp_descr_set¶
En valfri pekare till en funktion för att ställa in och ta bort en descriptors värde.
Funktionens signatur är:
int tp_descr_set(PyObject *self, PyObject *obj, PyObject *value);
Argumentet värde sätts till
NULL
för att ta bort värdet.Arv:
Detta fält ärvs av subtyperna.
-
Py_ssize_t PyTypeObject.tp_dictoffset¶
Även om detta fält fortfarande stöds, bör
Py_TPFLAGS_MANAGED_DICT
användas istället, om det är möjligt.Om instanserna av denna typ har en ordbok som innehåller instansvariabler, är detta fält icke-noll och innehåller offset i instanserna av typen av instansvariabelordboken; denna offset används av
PyObject_GenericGetAttr()
.Förväxla inte detta fält med
tp_dict
; det är ordlistan för attribut för själva typobjektet.Värdet anger ordbokens förskjutning från början av instansstrukturen.
tp_dictoffset
bör betraktas som skrivskyddad. För att få pekaren till ordlistan anropaPyObject_GenericGetDict()
. Anrop avPyObject_GenericGetDict()
kan behöva allokera minne för ordlistan, så det kan vara mer effektivt att anropaPyObject_GetAttr()
när man vill komma åt ett attribut på objektet.Det är ett fel att ange både
Py_TPFLAGS_MANAGED_DICT
bit ochtp_dictoffset
.Arv:
Detta fält ärvs av subtyper. En subtyp bör inte åsidosätta denna offset; det kan vara osäkert om C-kod försöker komma åt ordboken vid den tidigare offset. För att korrekt stödja arv, använd
Py_TPFLAGS_MANAGED_DICT
.Standard:
Denna slot har inget standardvärde. För statiska typer, om fältet är
NULL
skapas ingen__dict__
för instanser.Om bitarna
Py_TPFLAGS_MANAGED_DICT
är inställda i fältettp_flags
, så kommertp_dictoffset
att sättas till-1
, för att indikera att det är osäkert att använda detta fält.
-
initproc PyTypeObject.tp_init¶
En valfri pekare till en instansinitialiseringsfunktion.
Denna funktion motsvarar metoden
__init__()
för klasser. Precis som__init__()
är det möjligt att skapa en instans utan att anropa__init__()
, och det är möjligt att återinitialisera en instans genom att anropa dess__init__()
-metod igen.Funktionens signatur är:
int tp_init(PyObject *self, PyObject *args, PyObject *kwds);
Argumentet self är den instans som ska initialiseras; argumenten args och kwds representerar positions- och nyckelordsargument för anropet till
__init__()
.Funktionen
tp_init
, om den inte ärNULL
, anropas när en instans skapas normalt genom att anropa dess typ, efter att typens funktiontp_new
har returnerat en instans av typen. Om funktionentp_new
returnerar en instans av någon annan typ som inte är en subtyp av den ursprungliga typen anropas ingen funktiontp_init
; omtp_new
returnerar en instans av en subtyp av den ursprungliga typen anropas subtypens funktiontp_init
.Returnerar
0
vid framgång,-1
och anger ett undantag vid fel.Arv:
Detta fält ärvs av subtyperna.
Standard:
För static types har detta fält ingen standard.
-
allocfunc PyTypeObject.tp_alloc¶
En valfri pekare till en funktion för instansallokering.
Funktionens signatur är:
PyObject *tp_alloc(PyTypeObject *self, Py_ssize_t nitems);
Arv:
Statiska subtyper ärver denna slot, som kommer att vara
PyType_GenericAlloc()
om den ärvs frånobject
.Heap subtyper ärver inte denna slot.
Standard:
För subtyper av heap är detta fält alltid inställt på
PyType_GenericAlloc()
.För statiska subtyper ärvs denna plats (se ovan).
-
newfunc PyTypeObject.tp_new¶
En valfri pekare till en funktion för att skapa en instans.
Funktionens signatur är:
PyObject *tp_new(PyTypeObject *subtype, PyObject *args, PyObject *kwds);
Argumentet subtype är typen av det objekt som skapas; argumenten args och kwds representerar positions- och nyckelordsargument i anropet till typen. Observera att subtype inte behöver vara lika med den typ vars
tp_new
-funktion anropas; det kan vara en subtyp av den typen (men inte en orelaterad typ).Funktionen
tp_new
bör anropasubtype->tp_alloc(subtype, nitems)
för att allokera utrymme för objektet, och sedan bara göra så mycket ytterligare initialisering som är absolut nödvändigt. Initialisering som säkert kan ignoreras eller upprepas bör placeras i handlarentp_init
. En bra tumregel är att för oföränderliga typer bör all initialisering ske itp_new
, medan för föränderliga typer bör de flesta initialiseringar skjutas upp tilltp_init
.Ange flaggan
Py_TPFLAGS_DISALLOW_INSTANTIATION
för att inte tillåta att instanser av typen skapas i Python.Arv:
Detta fält ärvs av subtyper, förutom att det inte ärvs av static types vars
tp_base
ärNULL
eller&PyBaseObject_Type
.Standard:
För static types har detta fält ingen standard. Detta innebär att om slot definieras som
NULL
kan typen inte anropas för att skapa nya instanser; förmodligen finns det något annat sätt att skapa instanser, som en fabriksfunktion.
-
freefunc PyTypeObject.tp_free¶
En valfri pekare till en funktion för avallokering av instanser. Dess signatur är:
void tp_free(void *self);
Denna funktion måste frigöra det minne som allokerats av
tp_alloc
.Arv:
Statiska subtyper ärver denna slot, som kommer att vara
PyObject_Free()
om den ärvs frånobject
. Undantag för detta: Om typen stöder garbage collection (dvs. flagganPy_TPFLAGS_HAVE_GC
är inställd itp_flags
) och den skulle ärvaPyObject_Free()
, ärvs inte denna slot utan är istället standardvärdet förPyObject_GC_Del()
.Heap subtyper ärver inte denna slot.
Standard:
För heap subtypes, är standardvärdet för denna plats en deallokator som är lämplig för att matcha
PyType_GenericAlloc()
och värdet på flagganPy_TPFLAGS_HAVE_GC
.För statiska subtyper ärvs denna plats (se ovan).
-
inquiry PyTypeObject.tp_is_gc¶
En valfri pekare till en funktion som anropas av skräpsamlaren.
Skräpsamlaren behöver veta om ett visst objekt är insamlingsbart eller inte. Normalt räcker det att titta på objekttypens fält
tp_flags
och kontrollera flaggbitenPy_TPFLAGS_HAVE_GC
. Men vissa typer har en blandning av statiskt och dynamiskt allokerade instanser, och de statiskt allokerade instanserna är inte insamlingsbara. Sådana typer bör definiera denna funktion; den bör returnera1
för en samlingsbar instans och0
för en icke-samlingsbar instans. Signaturen är:int tp_is_gc(PyObject *self);
(Det enda exemplet på detta är typerna själva. Metatypen,
PyType_Type
, definierar den här funktionen för att skilja mellan statiskt och dynamiskt allokerade typer.)Arv:
Detta fält ärvs av subtyperna.
Standard:
Denna slot har ingen standard. Om detta fält är
NULL
, användsPy_TPFLAGS_HAVE_GC
som funktionell motsvarighet.
-
PyObject *PyTypeObject.tp_bases¶
Tupel av bastyper.
Detta fält bör sättas till
NULL
och behandlas som skrivskyddat. Python kommer att fylla i det när typen ärinitialiserad
.För dynamiskt skapade klasser kan
Py_tp_bases
slot
användas istället för bases-argumentet iPyType_FromSpecWithBases()
. Argumentformen är att föredra.Varning
Multipel nedärvning fungerar inte bra för statiskt definierade typer. Om du ställer in
tp_bases
till en tupel kommer Python inte att ge upphov till ett fel, men vissa slots kommer endast att ärvas från den första basen.Arv:
Detta fält är inte ärftligt.
-
PyObject *PyTypeObject.tp_mro¶
Tupel som innehåller den utökade uppsättningen bastyper, som börjar med typen själv och slutar med
object
, i Method Resolution Order.Detta fält bör sättas till
NULL
och behandlas som skrivskyddat. Python kommer att fylla i det när typen ärinitialiserad
.Arv:
Detta fält är inte ärftligt, utan beräknas av
PyType_Ready()
.
-
PyObject *PyTypeObject.tp_cache¶
Oanvänd. Endast för internt bruk.
Arv:
Detta fält är inte ärftligt.
-
void *PyTypeObject.tp_subclasses¶
En samling av underklasser. Endast för internt bruk. Kan vara en ogiltig pekare.
För att få en lista över underklasser anropar du Python-metoden
__subclasses__()
.Ändrad i version 3.12: För vissa typer innehåller detta fält inte ett giltigt PyObject*. Typen ändrades till void* för att ange detta.
Arv:
Detta fält är inte ärftligt.
-
PyObject *PyTypeObject.tp_weaklist¶
Svag referenslistans huvud, för svaga referenser till detta typobjekt. Ärvs inte. Endast för internt bruk.
Ändrad i version 3.12: Intern detalj: För de statiska inbyggda typerna är detta alltid
NULL
, även om weakrefs läggs till. Istället lagras weakrefs för var och en påPyInterpreterState
. Använd det publika C-API:et eller det interna makrot_PyObject_GET_WEAKREFS_LISTPTR()
för att undvika skillnaden.Arv:
Detta fält är inte ärftligt.
-
destructor PyTypeObject.tp_del¶
Detta fält är föråldrat. Använd
tp_finalize
istället.
-
unsigned int PyTypeObject.tp_version_tag¶
Används för att indexera till metodcachen. Endast för internt bruk.
Arv:
Detta fält är inte ärftligt.
-
destructor PyTypeObject.tp_finalize¶
En valfri pekare till en funktion för att avsluta en instans. Detta är C-implementeringen av specialmetoden
__del__()
. Dess signatur är:void tp_finalize(PyObject *self);
Det primära syftet med finalization är att utföra alla icke-triviala rensningar som måste utföras innan objektet förstörs, medan objektet och alla andra objekt som det direkt eller indirekt refererar till fortfarande är i ett konsekvent tillstånd. Finalizern tillåts exekvera godtycklig Python-kod.
Innan Python automatiskt finaliserar ett objekt kan några av objektets direkta eller indirekta referenter själva ha finaliserats automatiskt. Ingen av referenterna kommer dock att ha blivit automatiskt rensade (
tp_clear
) ännu.Andra icke-finaliserade objekt kan fortfarande använda ett finaliserat objekt, så finaliseraren måste lämna objektet i ett sunt tillstånd (t.ex. invarianter är fortfarande uppfyllda).
Anteckning
Efter att Python automatiskt har slutfört ett objekt kan Python automatiskt börja rensa (
tp_clear
) objektet och dess referenter (direkta och indirekta). Rensade objekt garanteras inte att vara i ett konsekvent tillstånd; ett färdigställt objekt måste kunna tolerera rensade referenter.Anteckning
Det är inte garanterat att ett objekt automatiskt finaliseras innan dess destruktor (
tp_dealloc
) anropas. Det rekommenderas att anropaPyObject_CallFinalizerFromDealloc()
i början avtp_dealloc
för att garantera att objektet alltid slutförs innan det förstörs.Anteckning
Funktionen
tp_finalize
kan anropas från valfri tråd, även om GIL kommer att hållas kvar.Anteckning
Funktionen
tp_finalize
kan anropas under nedstängning, efter att vissa globala variabler har tagits bort. Se dokumentationen för metoden__del__()
för detaljer.När Python finaliserar ett objekt beter det sig som följande algoritm:
Python kan markera objektet som finalized. För närvarande markerar Python alltid objekt vars typ stöder garbage collection (dvs. flaggan
Py_TPFLAGS_HAVE_GC
är inställd itp_flags
) och markerar aldrig andra typer av objekt; detta kan ändras i en framtida version.Om objektet inte är markerat som finalized och dess
tp_finalize
finalizer-funktion är icke-NULL
, anropas finalizer-funktionen.Om finalizer-funktionen anropades och finalizer gjorde objektet nåbart (dvs. det finns en referens till objektet och det är inte medlem i ett cyclic isolate), sägs finalizer ha återuppväckt objektet. Det är ospecificerat om finalizern också kan återuppliva objektet genom att lägga till en ny referens till objektet som inte gör det nåbart, dvs. objektet är (fortfarande) medlem i ett cykliskt isolat.
Om finalizer återuppväckte objektet avbryts objektets väntande förstörelse och objektets finalized-märke kan tas bort om det finns. För närvarande tar Python aldrig bort finalized-markeringen; detta kan ändras i en framtida version.
Automatisk finalisering avser all finalisering som utförs av Python utom via anrop till
PyObject_CallFinalizer()
ellerPyObject_CallFinalizerFromDealloc()
. Inga garantier ges för när, om eller hur ofta ett objekt automatiskt slutförs, förutom:Python kommer inte automatiskt att avsluta ett objekt om det är nåbart, dvs. det finns en referens till det och det är inte en medlem av en cyclic isolate.
Python kommer inte automatiskt att slutföra ett objekt om det inte skulle markera objektet som slutfört. För närvarande gäller detta för objekt vars typ inte stöder garbage collection, dvs. flaggan
Py_TPFLAGS_HAVE_GC
är inte inställd. Sådana objekt kan fortfarande slutföras manuellt genom att anropaPyObject_CallFinalizer()
ellerPyObject_CallFinalizerFromDealloc()
.Python kommer inte automatiskt att slutföra två medlemmar av en cyclic isolate samtidigt.
Python kommer inte automatiskt att slutföra ett objekt efter att det automatiskt har rensat (
tp_clear
) objektet.Om ett objekt är medlem i ett cyclic isolate, kommer Python inte automatiskt att slutföra det efter att automatiskt ha rensat (se
tp_clear
) någon annan medlem.Python kommer automatiskt att slutföra varje medlem i en cyclic isolate innan den automatiskt rensar (se
tp_clear
) någon av dem.Om Python automatiskt ska rensa ett objekt (
tp_clear
), kommer det automatiskt att slutföra objektet först.
Python slutför för närvarande endast automatiskt objekt som är medlemmar i en cyclic isolate, men framtida versioner kan komma att slutföra objekt regelbundet innan de förstörs.
Om du vill slutföra ett objekt manuellt ska du inte anropa den här funktionen direkt, utan anropa istället
PyObject_CallFinalizer()
ellerPyObject_CallFinalizerFromDealloc()
.tp_finalize
bör lämna den aktuella undantagsstatusen oförändrad. Det rekommenderade sättet att skriva en icke-trivial finalizer är att säkerhetskopiera undantaget i början genom att anropaPyErr_GetRaisedException()
och återställa undantaget i slutet genom att anropaPyErr_SetRaisedException()
. Om ett undantag påträffas i mitten av finalizer, logga och rensa det medPyErr_WriteUnraisable()
ellerPyErr_FormatUnraisable()
. Till exempel:static void foo_finalize(PyObject *self) { // Save the current exception, if any. PyObject *exc = PyErr_GetRaisedException(); // ... if (do_something_that_might_raise() != success_indicator) { PyErr_WriteUnraisable(self); goto done; } done: // Restore the saved exception. This silently discards any exception // raised above, so be sure to call PyErr_WriteUnraisable first if // necessary. PyErr_SetRaisedException(exc); }
Arv:
Detta fält ärvs av subtyperna.
Tillagd i version 3.4.
Ändrad i version 3.8: Före version 3.8 var det nödvändigt att sätta flaggbiten
Py_TPFLAGS_HAVE_FINALIZE
för att detta fält skulle kunna användas. Detta är inte längre nödvändigt.Se även
PEP 442: ”Säkert objekt färdigställs”
Objektets livscykel för detaljer om hur denna slot förhåller sig till andra slots.
-
vectorcallfunc PyTypeObject.tp_vectorcall¶
En vectorcall-funktion att använda för anrop av detta typobjekt (snarare än instanser). Med andra ord kan
tp_vectorcall
användas för att optimeratype.__call__
, som vanligtvis returnerar en ny instans av type.Som med alla vectorcall-funktioner, om
tp_vectorcall
ärNULL
, används tp_call-protokollet (Py_TYPE(type)->tp_call
) istället.Anteckning
vectorcall-protokoll kräver att vectorcall-funktionen har samma beteende som motsvarande
tp_call
. Detta innebär atttype->tp_vectorcall
måste matcha beteendet hosPy_TYPE(type)->tp_call
.Specifikt, om type använder standardmetaklassen, måste
type->tp_vectorcall
bete sig på samma sätt som PyType_Type->tp_call, vilket:anropar
type->tp_new
,om resultatet är en subklass av type, anropar
type->tp_init
på resultatet avtp_new
, ochreturnerar resultatet av
tp_new
.
Vanligtvis är
tp_vectorcall
åsidosatt för att optimera denna process för specifikatp_new
ochtp_init
. När du gör detta för användarsubklassbara typer, notera att båda kan åsidosättas (med__new__()
respektive__init__()
).Arv:
Detta fält är aldrig ärftligt.
Tillagd i version 3.9: (fältet har funnits sedan 3.8 men det används bara sedan 3.9)
-
unsigned char PyTypeObject.tp_watched¶
Internt. Får inte användas.
Tillagd i version 3.12.
Statiska typer¶
Traditionellt är typer som definieras i C-kod statiska, det vill säga en statisk PyTypeObject
-struktur definieras direkt i koden och initieras med PyType_Ready()
.
Detta resulterar i typer som är begränsade i förhållande till de typer som definieras i Python:
Statiska typer är begränsade till en bas, dvs. de kan inte använda multipel nedärvning.
Statiska typobjekt (men inte nödvändigtvis deras instanser) är oföränderliga. Det är inte möjligt att lägga till eller ändra typobjektets attribut från Python.
Statiska typobjekt delas mellan undertolkare, så de bör inte innehålla något undertolkarspecifikt tillstånd.
Eftersom PyTypeObject
endast är en del av Limited API som en opak struktur, måste alla tilläggsmoduler som använder statiska typer kompileras för en specifik mindre Python-version.
Typer av högar¶
Ett alternativ till statiska typer är heap-allokerade typer, eller heap-typer förkortat, som motsvarar klasser skapade med Pythons class
-sats. Heap-typer har flaggan Py_TPFLAGS_HEAPTYPE
inställd.
Detta görs genom att fylla en PyType_Spec
-struktur och anropa PyType_FromSpec()
, PyType_FromSpecWithBases()
, PyType_FromModuleAndSpec()
, eller PyType_FromMetaclass()
.
Strukturer för nummerobjekt¶
-
type PyNumberMethods¶
Denna struktur innehåller pekare till de funktioner som ett objekt använder för att implementera nummerprotokollet. Varje funktion används av funktionen med liknande namn som dokumenteras i avsnittet Nummerprotokoll.
Här är strukturdefinitionen:
typedef struct { binaryfunc nb_add; binaryfunc nb_subtract; binaryfunc nb_multiply; binaryfunc nb_remainder; binaryfunc nb_divmod; ternaryfunc nb_power; unaryfunc nb_negative; unaryfunc nb_positive; unaryfunc nb_absolute; inquiry nb_bool; unaryfunc nb_invert; binaryfunc nb_lshift; binaryfunc nb_rshift; binaryfunc nb_and; binaryfunc nb_xor; binaryfunc nb_or; unaryfunc nb_int; void *nb_reserved; unaryfunc nb_float; binaryfunc nb_inplace_add; binaryfunc nb_inplace_subtract; binaryfunc nb_inplace_multiply; binaryfunc nb_inplace_remainder; ternaryfunc nb_inplace_power; binaryfunc nb_inplace_lshift; binaryfunc nb_inplace_rshift; binaryfunc nb_inplace_and; binaryfunc nb_inplace_xor; binaryfunc nb_inplace_or; binaryfunc nb_floor_divide; binaryfunc nb_true_divide; binaryfunc nb_inplace_floor_divide; binaryfunc nb_inplace_true_divide; unaryfunc nb_index; binaryfunc nb_matrix_multiply; binaryfunc nb_inplace_matrix_multiply; } PyNumberMethods;
Anteckning
Binära och ternära funktioner måste kontrollera typen av alla sina operander och implementera nödvändiga konverteringar (minst en av operanderna är en instans av den definierade typen). Om operationen inte är definierad för de givna operanderna måste binära och ternära funktioner returnera
Py_NotImplemented
, om ett annat fel inträffade måste de returneraNULL
och ange ett undantag.Anteckning
Fältet
nb_reserved
bör alltid varaNULL
. Det kallades tidigarenb_long
, och döptes om i Python 3.0.1.
-
binaryfunc PyNumberMethods.nb_add¶
-
binaryfunc PyNumberMethods.nb_subtract¶
-
binaryfunc PyNumberMethods.nb_multiply¶
-
binaryfunc PyNumberMethods.nb_remainder¶
-
binaryfunc PyNumberMethods.nb_divmod¶
-
ternaryfunc PyNumberMethods.nb_power¶
-
unaryfunc PyNumberMethods.nb_negative¶
-
unaryfunc PyNumberMethods.nb_positive¶
-
unaryfunc PyNumberMethods.nb_absolute¶
-
inquiry PyNumberMethods.nb_bool¶
-
unaryfunc PyNumberMethods.nb_invert¶
-
binaryfunc PyNumberMethods.nb_lshift¶
-
binaryfunc PyNumberMethods.nb_rshift¶
-
binaryfunc PyNumberMethods.nb_and¶
-
binaryfunc PyNumberMethods.nb_xor¶
-
binaryfunc PyNumberMethods.nb_or¶
-
unaryfunc PyNumberMethods.nb_int¶
-
void *PyNumberMethods.nb_reserved¶
-
unaryfunc PyNumberMethods.nb_float¶
-
binaryfunc PyNumberMethods.nb_inplace_add¶
-
binaryfunc PyNumberMethods.nb_inplace_subtract¶
-
binaryfunc PyNumberMethods.nb_inplace_multiply¶
-
binaryfunc PyNumberMethods.nb_inplace_remainder¶
-
ternaryfunc PyNumberMethods.nb_inplace_power¶
-
binaryfunc PyNumberMethods.nb_inplace_lshift¶
-
binaryfunc PyNumberMethods.nb_inplace_rshift¶
-
binaryfunc PyNumberMethods.nb_inplace_and¶
-
binaryfunc PyNumberMethods.nb_inplace_xor¶
-
binaryfunc PyNumberMethods.nb_inplace_or¶
-
binaryfunc PyNumberMethods.nb_floor_divide¶
-
binaryfunc PyNumberMethods.nb_true_divide¶
-
binaryfunc PyNumberMethods.nb_inplace_floor_divide¶
-
binaryfunc PyNumberMethods.nb_inplace_true_divide¶
-
unaryfunc PyNumberMethods.nb_index¶
-
binaryfunc PyNumberMethods.nb_matrix_multiply¶
-
binaryfunc PyNumberMethods.nb_inplace_matrix_multiply¶
Mappning av objektstrukturer¶
-
type PyMappingMethods¶
Denna struktur innehåller pekare till de funktioner som ett objekt använder för att implementera mappningsprotokollet. Den har tre medlemmar:
-
lenfunc PyMappingMethods.mp_length¶
Denna funktion används av
PyMapping_Size()
ochPyObject_Size()
, och har samma signatur. Denna slot kan sättas tillNULL
om objektet inte har någon definierad längd.
-
binaryfunc PyMappingMethods.mp_subscript¶
Denna funktion används av
PyObject_GetItem()
ochPySequence_GetSlice()
, och har samma signatur somPyObject_GetItem()
. Denna slot måste vara fylld för att funktionenPyMapping_Check()
ska returnera1
, annars kan den varaNULL
.
-
objobjargproc PyMappingMethods.mp_ass_subscript¶
Denna funktion används av
PyObject_SetItem()
,PyObject_DelItem()
,PySequence_SetSlice()
ochPySequence_DelSlice()
. Den har samma signatur somPyObject_SetItem()
, men v kan också sättas tillNULL
för att radera ett objekt. Om denna slot ärNULL
har objektet inte stöd för tilldelning och borttagning av objekt.
Strukturer för sekvensobjekt¶
-
type PySequenceMethods¶
Denna struktur innehåller pekare till de funktioner som ett objekt använder för att implementera sekvensprotokollet.
-
lenfunc PySequenceMethods.sq_length¶
Denna funktion används av
PySequence_Size()
ochPyObject_Size()
, och har samma signatur. Den används också för att hantera negativa index viasq_item
ochsq_ass_item
.
-
binaryfunc PySequenceMethods.sq_concat¶
Denna funktion används av
PySequence_Concat()
och har samma signatur. Den används också av operatorn+
, efter att ha försökt numerisk addition vianb_add
slot.
-
ssizeargfunc PySequenceMethods.sq_repeat¶
Denna funktion används av
PySequence_Repeat()
och har samma signatur. Den används också av operatorn*
, efter att ha försökt numerisk multiplikation vianb_multiply
slot.
-
ssizeargfunc PySequenceMethods.sq_item¶
Denna funktion används av
PySequence_GetItem()
och har samma signatur. Den används också avPyObject_GetItem()
, efter att ha provat prenumerationen viamp_subscript
slot. Denna slot måste vara fylld för att funktionenPySequence_Check()
skall returnera1
, annars kan den varaNULL
.Negativa index hanteras på följande sätt: om
sq_length
är fylld, anropas den och sekvenslängden används för att beräkna ett positivt index som skickas tillsq_item
. Omsq_length
ärNULL
, skickas indexet som det är till funktionen.
-
ssizeobjargproc PySequenceMethods.sq_ass_item¶
Denna funktion används av
PySequence_SetItem()
och har samma signatur. Den används också avPyObject_SetItem()
ochPyObject_DelItem()
, efter att ha försökt tilldelning och borttagning av objekt viamp_ass_subscript
slot. Denna slot kan lämnas tillNULL
om objektet inte stöder tilldelning och borttagning av objekt.
-
objobjproc PySequenceMethods.sq_contains¶
Denna funktion kan användas av
PySequence_Contains()
och har samma signatur. Denna plats kan lämnas tillNULL
, i detta fall kommerPySequence_Contains()
helt enkelt att korsa sekvensen tills den hittar en matchning.
-
binaryfunc PySequenceMethods.sq_inplace_concat¶
Denna funktion används av
PySequence_InPlaceConcat()
och har samma signatur. Den bör modifiera sin första operand och returnera den. Denna plats kan lämnas tillNULL
, i detta fall kommerPySequence_InPlaceConcat()
att falla tillbaka tillPySequence_Concat()
. Den används också av den utökade tilldelningen+=
, efter att ha försökt numerisk in-place addition vianb_inplace_add
slot.
-
ssizeargfunc PySequenceMethods.sq_inplace_repeat¶
Denna funktion används av
PySequence_InPlaceRepeat()
och har samma signatur. Den bör modifiera sin första operand och returnera den. Denna plats kan lämnas tillNULL
, i detta fall kommerPySequence_InPlaceRepeat()
att falla tillbaka tillPySequence_Repeat()
. Den används också av den utökade tilldelningen*=
, efter att ha försökt numerisk multiplikation på plats vianb_inplace_multiply
slot.
Strukturer för buffertobjekt¶
-
type PyBufferProcs¶
Denna struktur innehåller pekare till de funktioner som krävs enligt Buffer protocol. Protokollet definierar hur ett exportobjekt kan exponera sina interna data till konsumentobjekt.
-
getbufferproc PyBufferProcs.bf_getbuffer¶
Signaturen för denna funktion är:
int (PyObject *exporter, Py_buffer *view, int flags);
Hantera en begäran till exporter om att fylla i view enligt specifikationen i flags. Med undantag för punkt (3) MÅSTE en implementering av denna funktion vidta följande steg:
Kontrollera om begäran kan uppfyllas. Om inte, skapa
BufferError
, sätt view->obj tillNULL
och returnera-1
.Fyll i de begärda fälten.
Öka en intern räknare för antalet exporter.
Sätt view->obj till exporter och inkrementera view->obj.
Returnera
0
.
Om exporter är en del av en kedja eller ett träd av buffertleverantörer kan två huvudsakliga system användas:
Återexportera: Varje medlem i trädet fungerar som det exporterande objektet och sätter view->obj till en ny referens till sig själv.
Redirect: Buffertbegäran omdirigeras till trädets rotobjekt. Här kommer view->obj att vara en ny referens till rotobjektet.
De enskilda fälten i view beskrivs i avsnitt Buffertstruktur, reglerna för hur en exportör måste reagera på specifika förfrågningar finns i avsnitt Buffertförfrågningstyper.
Allt minne som pekas ut i
Py_buffer
-strukturen tillhör exportören och måste förbli giltigt tills det inte finns några konsumenter kvar.format
,shape
,strides
,suboffsets
ochinternal
är skrivskyddade för konsumenten.PyBuffer_FillInfo()
ger ett enkelt sätt att exponera en enkel bytesbuffert samtidigt som alla typer av förfrågningar hanteras korrekt.PyObject_GetBuffer()
är gränssnittet för den konsument som omsluter denna funktion.
-
releasebufferproc PyBufferProcs.bf_releasebuffer¶
Signaturen för denna funktion är:
void (PyObject *exporter, Py_buffer *view);
Hanterar en begäran om att frigöra buffertens resurser. Om inga resurser behöver frigöras kan
PyBufferProcs.bf_releasebuffer
varaNULL
. Annars kommer en standardimplementering av denna funktion att vidta dessa valfria steg:Minskar en intern räknare för antalet exporter.
Om räknaren är
0
, frigör allt minne som är associerat med view.
Exportören MÅSTE använda fältet
internal
för att hålla reda på buffertspecifika resurser. Detta fält är garanterat konstant, medan en konsument KAN skicka en kopia av den ursprungliga bufferten som view-argument.Denna funktion FÅR INTE decimera view->obj, eftersom det görs automatiskt i
PyBuffer_Release()
(detta system är användbart för att bryta referenscykler).PyBuffer_Release()
är gränssnittet för den konsument som omsluter denna funktion.
Strukturer för asynkrona objekt¶
Tillagd i version 3.5.
-
type PyAsyncMethods¶
Denna struktur innehåller pekare till de funktioner som krävs för att implementera objekten awaitable och asynchronous iterator.
Här är strukturdefinitionen:
typedef struct { unaryfunc am_await; unaryfunc am_aiter; unaryfunc am_anext; sendfunc am_send; } PyAsyncMethods;
-
unaryfunc PyAsyncMethods.am_await¶
Signaturen för denna funktion är:
PyObject *am_await(PyObject *self);
Det returnerade objektet måste vara en iterator, d.v.s.
PyIter_Check()
måste returnera1
för det.Denna slot kan sättas till
NULL
om ett objekt inte är en awaitable.
-
unaryfunc PyAsyncMethods.am_aiter¶
Signaturen för denna funktion är:
PyObject *am_aiter(PyObject *self);
Måste returnera ett asynkron iterator-objekt. Se
__anext__()
för detaljer.Denna slot kan sättas till
NULL
om ett objekt inte implementerar asynkront iterationsprotokoll.
-
unaryfunc PyAsyncMethods.am_anext¶
Signaturen för denna funktion är:
PyObject *am_anext(PyObject *self);
Måste returnera ett awaitable-objekt. Se
__anext__()
för detaljer. Denna slot kan sättas tillNULL
.
-
sendfunc PyAsyncMethods.am_send¶
Signaturen för denna funktion är:
PySendResult am_send(PyObject *self, PyObject *arg, PyObject **result);
Se
PyIter_Send()
för detaljer. Denna slot kan sättas tillNULL
.Tillagd i version 3.10.
Slotstyp typedef¶
-
typedef PyObject *(*allocfunc)(PyTypeObject *cls, Py_ssize_t nitems)¶
- En del av Stabil ABI.
Syftet med denna funktion är att separera minnesallokering från minnesinitialisering. Den ska returnera en pekare till ett minnesblock som är tillräckligt långt för instansen, lämpligt inriktat och initialiserat till nollor, men med
ob_refcnt
satt till1
ochob_type
satt till typargumentet. Om typenstp_itemsize
inte är noll, ska objektetsob_size
initialiseras till nitems och längden på det allokerade minnesblocket blirtp_basicsize + nitems*tp_itemsize
, avrundat uppåt till en multipel avsizeof(void*)
; annars används inte nitems och längden på blocket blirtp_basicsize
.Denna funktion bör inte göra någon annan instansinitialisering, inte ens för att allokera ytterligare minne; det bör göras av
tp_new
.
-
typedef void (*destructor)(PyObject*)¶
- En del av Stabil ABI.
-
typedef PyObject *(*newfunc)(PyTypeObject*, PyObject*, PyObject*)¶
- En del av Stabil ABI.
Se
tp_new
.
-
typedef PyObject *(*reprfunc)(PyObject*)¶
- En del av Stabil ABI.
Se
tp_repr
.
-
typedef PyObject *(*getattrfunc)(PyObject *self, char *attr)¶
- En del av Stabil ABI.
Returnerar värdet på det namngivna attributet för objektet.
-
typedef int (*setattrfunc)(PyObject *self, char *attr, PyObject *value)¶
- En del av Stabil ABI.
Ställ in värdet på det namngivna attributet för objektet. Argumentet value sätts till
NULL
för att ta bort attributet.
-
typedef PyObject *(*getattrofunc)(PyObject *self, PyObject *attr)¶
- En del av Stabil ABI.
Returnerar värdet på det namngivna attributet för objektet.
Se
tp_getattro
.
-
typedef int (*setattrofunc)(PyObject *self, PyObject *attr, PyObject *value)¶
- En del av Stabil ABI.
Ställ in värdet på det namngivna attributet för objektet. Argumentet value sätts till
NULL
för att ta bort attributet.Se
tp_setattro
.
-
typedef PyObject *(*descrgetfunc)(PyObject*, PyObject*, PyObject*)¶
- En del av Stabil ABI.
Se
tp_descr_get
.
-
typedef int (*descrsetfunc)(PyObject*, PyObject*, PyObject*)¶
- En del av Stabil ABI.
Se
tp_descr_set
.
-
typedef Py_hash_t (*hashfunc)(PyObject*)¶
- En del av Stabil ABI.
Se
tp_hash
.
-
typedef PyObject *(*richcmpfunc)(PyObject*, PyObject*, int)¶
- En del av Stabil ABI.
Se
tp_richcompare
.
-
typedef PyObject *(*getiterfunc)(PyObject*)¶
- En del av Stabil ABI.
Se
tp_iter
.
-
typedef PyObject *(*iternextfunc)(PyObject*)¶
- En del av Stabil ABI.
Se
tp_iternext
.
-
typedef Py_ssize_t (*lenfunc)(PyObject*)¶
- En del av Stabil ABI.
-
typedef int (*getbufferproc)(PyObject*, Py_buffer*, int)¶
- En del av Stabil ABI sedan version 3.12.
-
typedef void (*releasebufferproc)(PyObject*, Py_buffer*)¶
- En del av Stabil ABI sedan version 3.12.
-
typedef PyObject *(*unaryfunc)(PyObject*)¶
- En del av Stabil ABI.
-
typedef PyObject *(*binaryfunc)(PyObject*, PyObject*)¶
- En del av Stabil ABI.
-
typedef PyObject *(*ssizeargfunc)(PyObject*, Py_ssize_t)¶
- En del av Stabil ABI.
-
typedef int (*ssizeobjargproc)(PyObject*, Py_ssize_t, PyObject*)¶
- En del av Stabil ABI.
-
typedef int (*objobjproc)(PyObject*, PyObject*)¶
- En del av Stabil ABI.
-
typedef int (*objobjargproc)(PyObject*, PyObject*, PyObject*)¶
- En del av Stabil ABI.
Exempel¶
Följande är enkla exempel på Python-typdefinitioner. De inkluderar vanlig användning som du kan stöta på. Några demonstrerar knepiga hörnfall. För fler exempel, praktisk information och en handledning, se Definiera typer av tillägg: Handledning och Definiera utökningstyper: Blandade ämnen.
En grundläggande statisk typ:
typedef struct {
PyObject_HEAD
const char *data;
} MyObject;
static PyTypeObject MyObject_Type = {
PyVarObject_HEAD_INIT(NULL, 0)
.tp_name = "mymod.MyObject",
.tp_basicsize = sizeof(MyObject),
.tp_doc = PyDoc_STR("My objects"),
.tp_new = myobj_new,
.tp_dealloc = (destructor)myobj_dealloc,
.tp_repr = (reprfunc)myobj_repr,
};
Du kan också hitta äldre kod (särskilt i CPython-kodbasen) med en mer utförlig initialiserare:
static PyTypeObject MyObject_Type = {
PyVarObject_HEAD_INIT(NULL, 0)
"mymod.MyObject", /* tp_name */
sizeof(MyObject), /* tp_basicsize */
0, /* tp_itemsize */
(destructor)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("My objects"), /* 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 */
};
En typ som stöder weakrefs, instance dicts och hashing:
typedef struct {
PyObject_HEAD
const char *data;
} MyObject;
static PyTypeObject MyObject_Type = {
PyVarObject_HEAD_INIT(NULL, 0)
.tp_name = "mymod.MyObject",
.tp_basicsize = sizeof(MyObject),
.tp_doc = PyDoc_STR("My objects"),
.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 = (inquiry)myobj_clear,
.tp_alloc = PyType_GenericNew,
.tp_dealloc = (destructor)myobj_dealloc,
.tp_repr = (reprfunc)myobj_repr,
.tp_hash = (hashfunc)myobj_hash,
.tp_richcompare = PyBaseObject_Type.tp_richcompare,
};
En str-underklass som inte kan underklassas och inte kan anropas för att skapa instanser (t.ex. använder en separat fabriksfunktion) med Py_TPFLAGS_DISALLOW_INSTANTIATION
flagga:
typedef struct {
PyUnicodeObject raw;
char *extra;
} MyStr;
static PyTypeObject MyStr_Type = {
PyVarObject_HEAD_INIT(NULL, 0)
.tp_name = "mymod.MyStr",
.tp_basicsize = sizeof(MyStr),
.tp_base = NULL, // ställ in till &PyUnicode_Type i modulen init
.tp_doc = PyDoc_STR("my custom str"),
.tp_flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_DISALLOW_INSTANTIATION,
.tp_repr = (reprfunc)myobj_repr,
};
Den enklaste statiska typen med instanser av fast längd:
typedef struct {
PyObject_HEAD
} MyObject;
static PyTypeObject MyObject_Type = {
PyVarObject_HEAD_INIT(NULL, 0)
.tp_name = "mymod.MyObject",
};
Den enklaste statiska typen med instanser av variabel längd:
typedef struct {
PyObject_VAR_HEAD
const char *data[1];
} MyObject;
static PyTypeObject MyObject_Type = {
PyVarObject_HEAD_INIT(NULL, 0)
.tp_name = "mymod.MyObject",
.tp_basicsize = sizeof(MyObject) - sizeof(char *),
.tp_itemsize = sizeof(char *),
};