Typ av objekt

type PyTypeObject
En del av Begränsat API (som en ogenomskinlig struktur).

C-strukturen för de objekt som används för att beskriva inbyggda typer.

PyTypeObject PyType_Type
En del av Stabil ABI.

Detta är typobjektet för typobjekt; det är samma objekt som type i Python-lagret.

int PyType_Check(PyObject *o)

Returnerar icke-noll om objektet o är ett typobjekt, inklusive instanser av typer som härrör från standardtypobjektet. Returnera 0 i alla andra fall. Denna funktion lyckas alltid.

int PyType_CheckExact(PyObject *o)

Returnerar icke-noll om objektet o är ett typobjekt, men inte en subtyp av standardtypobjektet. Returnera 0 i alla andra fall. Denna funktion lyckas alltid.

unsigned int PyType_ClearCache()
En del av Stabil ABI.

Tömmer den interna lookup-cachen. Returnera den aktuella versionstaggen.

unsigned long PyType_GetFlags(PyTypeObject *type)
En del av Stabil ABI.

Returnerar tp_flags-medlemmen av type. Denna funktion är främst avsedd att användas med Py_LIMITED_API; de enskilda flaggbitarna är garanterat stabila över Python-utgåvor, men åtkomst till tp_flags i sig är inte en del av limited API.

Tillagd i version 3.2.

Ändrad i version 3.4: Returtypen är nu unsigned long istället för long.

PyObject *PyType_GetDict(PyTypeObject *type)

Returnerar typobjektets interna namnrymd, som annars bara är tillgänglig via en skrivskyddad proxy (cls.__dict__). Detta är en ersättning för direkt åtkomst till tp_dict. Den returnerade ordboken måste behandlas som skrivskyddad.

Denna funktion är avsedd för specifika fall av inbäddning och språkbindning, där direkt åtkomst till dict är nödvändig och indirekt åtkomst (t.ex. via proxy eller PyObject_GetAttr()) inte är tillräcklig.

Tilläggsmoduler bör fortsätta att använda tp_dict, direkt eller indirekt, när de skapar sina egna typer.

Tillagd i version 3.12.

void PyType_Modified(PyTypeObject *type)
En del av Stabil ABI.

Invalidera den interna lookup-cachen för typen och alla dess subtyper. Denna funktion måste anropas efter varje manuell ändring av typens attribut eller basklasser.

int PyType_AddWatcher(PyType_WatchCallback callback)

Registrera callback som en typövervakare. Returnera ett icke-negativt heltals-ID som måste skickas till framtida anrop till PyType_Watch(). I händelse av fel (t.ex. inga fler bevaknings-IDs tillgängliga), returnera -1 och sätt ett undantag.

I fritt trådade system är PyType_AddWatcher() inte trådsäker, så den måste anropas vid start (innan den första tråden skapas).

Tillagd i version 3.12.

int PyType_ClearWatcher(int watcher_id)

Rensa en övervakare som identifierats av watcher_id (tidigare returnerad från PyType_AddWatcher()). Returnerar 0 vid framgång, -1 vid fel (t.ex. om watcher_id aldrig registrerades)

Ett tillägg bör aldrig anropa PyType_ClearWatcher med ett watcher_id som inte returnerades till det av ett tidigare anrop till PyType_AddWatcher().

Tillagd i version 3.12.

int PyType_Watch(int watcher_id, PyObject *type)

Markera type som bevakad. Återkallelsen som tilldelats watcher_id av PyType_AddWatcher() kommer att anropas varje gång PyType_Modified() rapporterar en ändring av type. (Återkallelsen kan anropas endast en gång för en serie på varandra följande ändringar av type, om _PyType_Lookup() inte anropas på type mellan ändringarna; detta är en implementationsdetalj och kan komma att ändras)

Ett tillägg bör aldrig anropa PyType_Watch med ett watcher_id som inte returnerades till det av ett tidigare anrop till PyType_AddWatcher().

Tillagd i version 3.12.

typedef int (*PyType_WatchCallback)(PyObject *type)

Typ av callback-funktion för en typbevakare.

Återkallelsen får inte modifiera typ eller orsaka att PyType_Modified() anropas på typ eller någon typ i dess MRO; att bryta mot denna regel kan orsaka oändlig rekursion.

Tillagd i version 3.12.

int PyType_HasFeature(PyTypeObject *o, int feature)

Returnerar icke-noll om typobjektet o anger egenskapen feature. Typfunktioner betecknas med enbitsflaggor.

int PyType_IS_GC(PyTypeObject *o)

Returnerar true om typobjektet innehåller stöd för cykeldetektorn; detta testar typflaggan Py_TPFLAGS_HAVE_GC.

int PyType_IsSubtype(PyTypeObject *a, PyTypeObject *b)
En del av Stabil ABI.

Returnerar true om a är en subtyp av b.

Den här funktionen kontrollerar bara faktiska subtyper, vilket innebär att __subclasscheck__() inte anropas på b. Anropa PyObject_IsSubclass() för att göra samma kontroll som issubclass() skulle göra.

PyObject *PyType_GenericAlloc(PyTypeObject *type, Py_ssize_t nitems)
Returnera värde: Ny referens. En del av Stabil ABI.

Generisk hanterare för tp_alloc -platsen för ett typobjekt. Använder Pythons standardmekanism för minnesallokering för att allokera minne för en ny instans, nollställer minnet och initialiserar sedan minnet som om det hade anropats PyObject_Init() eller PyObject_InitVar().

Anropa inte detta direkt för att allokera minne för ett objekt; anropa istället typens tp_alloc slot.

För typer som stöder garbage collection (dvs, flaggan Py_TPFLAGS_HAVE_GC är satt), beter sig denna funktion som PyObject_GC_New eller PyObject_GC_NewVar (förutom att minnet garanterat nollställs före initialisering), och bör paras ihop med PyObject_GC_Del() i tp_free. Annars beter den sig som PyObject_New eller PyObject_NewVar (förutom att minnet garanterat nollställs före initialisering) och bör paras ihop med PyObject_Free() i tp_free.

PyObject *PyType_GenericNew(PyTypeObject *type, PyObject *args, PyObject *kwds)
Returnera värde: Ny referens. En del av Stabil ABI.

Generisk hanterare för tp_new slot för ett typobjekt. Skapar en ny instans med hjälp av typens tp_alloc slot och returnerar det resulterande objektet.

int PyType_Ready(PyTypeObject *type)
En del av Stabil ABI.

Slutför ett typobjekt. Detta bör anropas på alla typobjekt för att avsluta deras initialisering. Denna funktion är ansvarig för att lägga till ärvda slots från en typs basklass. Returnera 0 vid framgång, eller returnera -1 och skapa ett undantag vid fel.

Anteckning

Om någon av basklasserna implementerar GC-protokollet och den angivna typen inte innehåller Py_TPFLAGS_HAVE_GC i sina flaggor, kommer GC-protokollet automatiskt att implementeras från dess föräldrar. Tvärtom, om den typ som skapas inkluderar Py_TPFLAGS_HAVE_GC i sina flaggor så måste den implementera GC-protokollet själv genom att åtminstone implementera tp_traverse -handtaget.

PyObject *PyType_GetName(PyTypeObject *type)
Returnera värde: Ny referens. En del av Stabil ABI sedan version 3.11.

Returnerar typens namn. Motsvarar att hämta typens attribut __name__.

Tillagd i version 3.11.

PyObject *PyType_GetQualName(PyTypeObject *type)
Returnera värde: Ny referens. En del av Stabil ABI sedan version 3.11.

Returnerar typens kvalificerade namn. Motsvarar hämtning av typens attribut __qualname__.

Tillagd i version 3.11.

PyObject *PyType_GetFullyQualifiedName(PyTypeObject *type)
En del av Stabil ABI sedan version 3.13.

Returnerar typens fullständigt kvalificerade namn. Motsvarar f"{type.__module__}.{type.__qualname__}", eller type.__qualname__ om type.__module__ inte är en sträng eller är lika med "builtins".

Tillagd i version 3.13.

PyObject *PyType_GetModuleName(PyTypeObject *type)
En del av Stabil ABI sedan version 3.13.

Returnerar typens modulnamn. Motsvarar hämtning av attributet type.__module__.

Tillagd i version 3.13.

void *PyType_GetSlot(PyTypeObject *type, int slot)
En del av Stabil ABI sedan version 3.4.

Returnerar den funktionspekare som finns lagrad i den angivna sloten. Om resultatet är NULL, indikerar detta att antingen slotten är NULL, eller att funktionen anropades med ogiltiga parametrar. Anropare kommer vanligtvis att kasta resultatpekaren till lämplig funktionstyp.

Se PyType_Slot.slot för möjliga värden på argumentet slot.

Tillagd i version 3.4.

Ändrad i version 3.10: PyType_GetSlot() kan nu acceptera alla typer. Tidigare var det begränsat till heap types.

PyObject *PyType_GetModule(PyTypeObject *type)
En del av Stabil ABI sedan version 3.10.

Returnerar modulobjektet som associeras med den angivna typen när typen skapades med PyType_FromModuleAndSpec().

Om ingen modul är associerad med den angivna typen, anger TypeError och returnerar NULL.

Denna funktion används vanligtvis för att hämta den modul i vilken en metod är definierad. Observera att i en sådan metod kanske inte PyType_GetModule(Py_TYPE(self)) returnerar det avsedda resultatet. Py_TYPE(self) kan vara en subklass av den avsedda klassen, och subklasser definieras inte nödvändigtvis i samma modul som deras superklass. Se PyCMethod för att få den klass som definierar metoden. Se PyType_GetModuleByDef() för fall då PyCMethod inte kan användas.

Tillagd i version 3.9.

void *PyType_GetModuleState(PyTypeObject *type)
En del av Stabil ABI sedan version 3.10.

Returnerar tillståndet för modulobjektet som är associerat med den givna typen. Detta är en genväg för att anropa PyModule_GetState() på resultatet av PyType_GetModule().

Om ingen modul är associerad med den angivna typen, anger TypeError och returnerar NULL.

Om typen har en associerad modul men dess tillstånd är NULL, returneras NULL utan att ett undantag anges.

Tillagd i version 3.9.

PyObject *PyType_GetModuleByDef(PyTypeObject *type, struct PyModuleDef *def)
Returnera värde: Lånad referens. En del av Stabil ABI sedan version 3.13.

Hitta den första superklassen vars modul skapades från den givna PyModuleDef def, och returnera den modulen.

Om ingen modul hittas genereras ett TypeError och returnerar NULL.

Den här funktionen är avsedd att användas tillsammans med PyModule_GetState() för att hämta modulstatus från slot-metoder (t.ex. tp_init eller nb_add) och andra ställen där en metods definierande klass inte kan skickas med anropskonventionen PyCMethod.

Den returnerade referensen är borrowed från type, och kommer att vara giltig så länge du har en referens till type. Frigör den inte med Py_DECREF() eller liknande.

Tillagd i version 3.11.

int PyType_GetBaseByToken(PyTypeObject *type, void *token, PyTypeObject **result)
En del av Stabil ABI sedan version 3.14.

Hitta den första superklassen i typ:s method resolution order vars Py_tp_token-token är lika med den angivna.

  • Om den hittas, sätt *result till en ny strong reference till den och returnera 1.

  • Om den inte hittas, sätt *result till NULL och returnera 0.

  • Vid fel, sätt *result till NULL och returnera -1 med en undantagsuppsättning.

Argumentet result kan vara NULL, i vilket fall *result inte anges. Använd detta om du bara behöver returvärdet.

Argumentet token får inte vara NULL.

Tillagd i version 3.14.

int PyUnstable_Type_AssignVersionTag(PyTypeObject *type)
Detta är Instabilt API. Den kan ändras utan förvarning i mindre versioner.

Försök att tilldela en versionstagg till den angivna typen.

Returnerar 1 om typen redan har en giltig versionstagg eller om en ny har tilldelats, eller 0 om en ny tagg inte kunde tilldelas.

Tillagd i version 3.12.

Skapa Heap-allokerade typer

Följande funktioner och strukturer används för att skapa heap types.

PyObject *PyType_FromMetaclass(PyTypeObject *metaclass, PyObject *module, PyType_Spec *spec, PyObject *bases)
En del av Stabil ABI sedan version 3.12.

Skapa och returnera en heap type från spec (se Py_TPFLAGS_HEAPTYPE).

Metaklassen metaclass används för att konstruera det resulterande typobjektet. När metaclass är NULL härleds metaklassen från bases (eller Py_tp_base[s] slots om bases är NULL, se nedan).

Metaklasser som åsidosätter tp_new stöds inte, förutom om tp_new är NULL.

Argumentet bases kan användas för att ange basklasser; det kan antingen vara bara en klass eller en tupel av klasser. Om bases är NULL används istället Py_tp_bases slot. Om det också är NULL, används Py_tp_base slot istället. Om det också är NULL, härstammar den nya typen från object.

Argumentet module kan användas för att registrera den modul i vilken den nya klassen definieras. Det måste vara ett modulobjekt eller NULL. Om det inte är NULL associeras modulen med den nya typen och kan senare hämtas med PyType_GetModule(). Den associerade modulen ärvs inte av underklasser utan måste anges för varje klass för sig.

Denna funktion anropar PyType_Ready() på den nya typen.

Observera att den här funktionen inte helt matchar beteendet för att anropa type() eller använda class-satsen. Med användartillhandahållna bastyper eller metaklasser, föredra anrop type (eller metaklassen) framför PyType_From*-funktioner. Specifikt för detta:

Tillagd i version 3.12.

PyObject *PyType_FromModuleAndSpec(PyObject *module, PyType_Spec *spec, PyObject *bases)
Returnera värde: Ny referens. En del av Stabil ABI sedan version 3.10.

Motsvarar PyType_FromMetaclass(NULL, module, spec, bases).

Tillagd i version 3.9.

Ändrad i version 3.10: Funktionen accepterar nu en enda klass som bases-argument och NULL som tp_doc-plats.

Ändrad i version 3.12: Funktionen hittar och använder nu en metaklass som motsvarar de angivna basklasserna. Tidigare returnerades endast type-instanser.

Metaklassens tp_new är ignorerad, vilket kan leda till ofullständig initialisering. Att skapa klasser vars metaklass åsidosätter tp_new är föråldrat.

Ändrad i version 3.14: Det är inte längre tillåtet att skapa klasser vars metaklass åsidosätter tp_new.

PyObject *PyType_FromSpecWithBases(PyType_Spec *spec, PyObject *bases)
Returnera värde: Ny referens. En del av Stabil ABI sedan version 3.3.

Motsvarar PyType_FromMetaclass(NULL, NULL, spec, bases).

Tillagd i version 3.3.

Ändrad i version 3.12: Funktionen hittar och använder nu en metaklass som motsvarar de angivna basklasserna. Tidigare returnerades endast type-instanser.

Metaklassens tp_new är ignorerad, vilket kan leda till ofullständig initialisering. Att skapa klasser vars metaklass åsidosätter tp_new är föråldrat.

Ändrad i version 3.14: Det är inte längre tillåtet att skapa klasser vars metaklass åsidosätter tp_new.

PyObject *PyType_FromSpec(PyType_Spec *spec)
Returnera värde: Ny referens. En del av Stabil ABI.

Motsvarar PyType_FromMetaclass(NULL, NULL, spec, NULL).

Ändrad i version 3.12: Funktionen hittar och använder nu en metaklass som motsvarar de basklasser som finns i Py_tp_base[s] slots. Tidigare returnerades endast type-instanser.

Metaklassens tp_new är ignorerad, vilket kan leda till ofullständig initialisering. Att skapa klasser vars metaklass åsidosätter tp_new är föråldrat.

Ändrad i version 3.14: Det är inte längre tillåtet att skapa klasser vars metaklass åsidosätter tp_new.

int PyType_Freeze(PyTypeObject *type)
En del av Stabil ABI sedan version 3.14.

Gör en typ oföränderlig: sätt flaggan Py_TPFLAGS_IMMUTABLETYPE.

Alla basklasser av typ måste vara oföränderliga.

Vid framgång, returnera 0. Vid fel, sätt ett undantag och returnera -1.

Typen får inte användas innan den görs oföränderlig. Typinstanser får t.ex. inte skapas innan typen har gjorts oföränderlig.

Tillagd i version 3.14.

type PyType_Spec
En del av Stabil ABI (inklusive alla medlemmar).

Struktur som definierar en typs beteende.

const char *name

Namn på typen, används för att ställa in PyTypeObject.tp_name.

int basicsize

Om positiv, anger storleken på instansen i bytes. Den används för att ställa in PyTypeObject.tp_basicsize.

Om noll, anger att tp_basicsize ska ärvas.

Om det är negativt anger det absoluta värdet hur mycket utrymme instanser av klassen behöver utöver superklassen. Använd PyObject_GetTypeData() för att få en pekare till underklassspecifikt minne som reserverats på detta sätt. För negativa basicsize, kommer Python att infoga utfyllnad när det behövs för att uppfylla tp_basicsizes anpassningskrav.

Ändrad i version 3.12: Tidigare kunde detta fält inte vara negativt.

int itemsize

Storleken på ett element i en typ med variabel storlek, i byte. Används för att ställa in PyTypeObject.tp_itemsize. Se dokumentationen för tp_itemsize för förbehåll.

Om noll, ärvs tp_itemsize. Att utöka godtyckliga klasser med variabel storlek är farligt, eftersom vissa typer använder en fast offset för minne med variabel storlek, som sedan kan överlappa minne med fast storlek som används av en underklass. För att hjälpa till att förhindra misstag är det bara möjligt att ärva itemsize i följande situationer:

unsigned int flags

Typflaggor, används för att ställa in PyTypeObject.tp_flags.

Om flaggan Py_TPFLAGS_HEAPTYPE inte är satt, sätter PyType_FromSpecWithBases() den automatiskt.

PyType_Slot *slots

Array av PyType_Slot-strukturer. Avslutas med det speciella slot-värdet {0, NULL}.

Varje slot-ID får anges högst en gång.

type PyType_Slot
En del av Stabil ABI (inklusive alla medlemmar).

Struktur som definierar valfri funktionalitet för en typ och som innehåller ett slot-ID och en värdepekare.

int slot

Ett slot-ID.

Slot-ID:n namnges som fältnamnen i strukturerna PyTypeObject, PyNumberMethods, PySequenceMethods, PyMappingMethods och PyAsyncMethods med ett extra prefix Py_. Använd till exempel:

En ytterligare slot stöds som inte motsvarar ett PyTypeObject struct-fält:

Följande ”offset”-fält kan inte ställas in med hjälp av PyType_Slot:

Om det inte är möjligt att byta till en MANAGED flagga (t.ex. för vectorcall eller för att stödja Python äldre än 3.12), ange offset i Py_tp_members. Se PyMemberDef-dokumentation för detaljer.

Följande interna fält kan inte anges alls när du skapar en heap-typ:

Att ställa in Py_tp_bases eller Py_tp_base kan vara problematiskt på vissa plattformar. För att undvika problem, använd bases-argumentet i PyType_FromSpecWithBases() istället.

Ändrad i version 3.9: Slots i PyBufferProcs kan ställas in i det obegränsade API:et.

Ändrad i version 3.11: bf_getbuffer och bf_releasebuffer är nu tillgängliga under limited API.

Ändrad i version 3.14: Fältet tp_vectorcall kan nu ställas in med hjälp av Py_tp_vectorcall. Se fältets dokumentation för detaljer.

void *pfunc

Det önskade värdet på platsen. I de flesta fall är detta en pekare till en funktion.

pfunc-värden får inte vara NULL, förutom för följande slots:

Py_tp_token

En slot som registrerar ett statiskt minneslayout-ID för en klass.

Om klassens PyType_Spec är statiskt allokerad kan token sättas till specen med hjälp av specialvärdet Py_TP_USE_SPEC:

static PyType_Slot foo_slots[] = {
   {Py_tp_token, Py_TP_USE_SPEC},

Den kan också ställas in på en godtycklig pekare, men det måste du se till:

  • Pekaren lever längre än klassen, så den återanvänds inte för något annat medan klassen existerar.

  • Den ”hör till” tillbyggnadsmodulen där klassen bor, så den kommer inte att krocka med andra tillbyggnader.

Använd PyType_GetBaseByToken() för att kontrollera om en klass superklass har en given token – det vill säga, kontrollera om minneslayouten är kompatibel.

Om du vill hämta token för en viss klass (utan att ta hänsyn till superklasser) använder du PyType_GetSlot() med Py_tp_token.

Tillagd i version 3.14.

Py_TP_USE_SPEC

Används som ett värde med Py_tp_token för att ställa in token till klassens PyType_Spec. Expanderar till NULL.

Tillagd i version 3.14.