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 medPy_LIMITED_API
; de enskilda flaggbitarna är garanterat stabila över Python-utgåvor, men åtkomst tilltp_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örlong
.
-
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 tilltp_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()
). Returnerar0
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 tillPyType_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ångPyType_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 tillPyType_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. AnropaPyObject_IsSubclass()
för att göra samma kontroll somissubclass()
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 anropatsPyObject_Init()
ellerPyObject_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 somPyObject_GC_New
ellerPyObject_GC_NewVar
(förutom att minnet garanterat nollställs före initialisering), och bör paras ihop medPyObject_GC_Del()
itp_free
. Annars beter den sig somPyObject_New
ellerPyObject_NewVar
(förutom att minnet garanterat nollställs före initialisering) och bör paras ihop medPyObject_Free()
itp_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 typenstp_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 inkluderarPy_TPFLAGS_HAVE_GC
i sina flaggor så måste den implementera GC-protokollet själv genom att åtminstone implementeratp_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__}"
, ellertype.__qualname__
omtype.__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 ärNULL
, 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 returnerarNULL
.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. SePyCMethod
för att få den klass som definierar metoden. SePyType_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 avPyType_GetModule()
.Om ingen modul är associerad med den angivna typen, anger
TypeError
och returnerarNULL
.Om typen har en associerad modul men dess tillstånd är
NULL
, returnerasNULL
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 returnerarNULL
.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
ellernb_add
) och andra ställen där en metods definierande klass inte kan skickas med anropskonventionenPyCMethod
.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 returnera0
.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 ärNULL
, se nedan).Metaklasser som åsidosätter
tp_new
stöds inte, förutom omtp_new
ärNULL
.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å ärNULL
, används Py_tp_base slot istället. Om det också ärNULL
, härstammar den nya typen frånobject
.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 ärNULL
associeras modulen med den nya typen och kan senare hämtas medPyType_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ändaclass
-satsen. Med användartillhandahållna bastyper eller metaklasser, föredra anroptype
(eller metaklassen) framförPyType_From*
-funktioner. Specifikt för detta:__new__()
anropas inte på den nya klassen (och den måste sättas tilltype.__new__
).__init__()
anropas inte på den nya klassen.__init_subclass__()
anropas inte på någon bas.__set_name__()
anropas inte på nya deskriptorer.
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
somtp_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ättertp_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ättertp_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ättertp_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 negativabasicsize
, kommer Python att infoga utfyllnad när det behövs för att uppfyllatp_basicsize
s 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örtp_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 ärvaitemsize
i följande situationer:Basen är inte variabel i storlek (dess
tp_itemsize
).Den begärda
PyType_Spec.basicsize
är positiv, vilket tyder på att minneslayouten för basklassen är känd.Den begärda
PyType_Spec.basicsize
är noll, vilket tyder på att underklassen inte har direkt åtkomst till instansens minne.Med flaggan
Py_TPFLAGS_ITEMS_AT_END
.
-
unsigned int flags¶
Typflaggor, används för att ställa in
PyTypeObject.tp_flags
.Om flaggan
Py_TPFLAGS_HEAPTYPE
inte är satt, sätterPyType_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.
-
const char *name¶
-
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
ochPyAsyncMethods
med ett extra prefixPy_
. Använd till exempel:Py_tp_dealloc
för att ställa inPyTypeObject.tp_dealloc
Py_nb_add
för att ställa inPyNumberMethods.nb_add
Py_sq_length
för att ställa inPySequenceMethods.sq_length
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
:tp_weaklistoffset
(användPy_TPFLAGS_MANAGED_WEAKREF
istället om möjligt)tp_dictoffset
(användPy_TPFLAGS_MANAGED_DICT
istället om möjligt)tp_vectorcall_offset
(använd"__vectorcalloffset__"
i PyMemberDef)
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 iPy_tp_members
. Se PyMemberDef-dokumentation för detaljer.Följande interna fält kan inte anges alls när du skapar en heap-typ:
tp_dict
,tp_mro
,tp_cache
,tp_subclasses
, ochtp_weaklist
.
Att ställa in
Py_tp_bases
ellerPy_tp_base
kan vara problematiskt på vissa plattformar. För att undvika problem, använd bases-argumentet iPyType_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
ochbf_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 avPy_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_doc
Py_tp_token
(för tydlighetens skull, föredraPy_TP_USE_SPEC
i stället förNULL
)
-
int slot¶
-
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ärdetPy_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()
medPy_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 klassensPyType_Spec
. Expanderar tillNULL
.Tillagd i version 3.14.