Python

형 객체

type PyTypeObject
…의 일부 안정 ABI (불투명 구조체로).

내장형을 기술하는 데 사용되는 객체의 C 구조체.

PyTypeObject PyType_Type
…의 일부 안정 ABI.

이것은 형 객체의 형 객체입니다; 파이썬 계층의 type과 같은 객체입니다.

int PyType_Check(PyObject *o)

객체 o가 표준형 객체에서 파생된 형의 인스턴스를 포함하여 형 객체면 0이 아닌 값을 반환합니다. 다른 모든 경우 0을 반환합니다. 이 함수는 항상 성공합니다.

int PyType_CheckExact(PyObject *o)

객체 o가 형 객체이지만, 표준형 객체의 서브 형이 아니면 0이 아닌 값을 반환합니다. 다른 모든 경우 0을 반환합니다. 이 함수는 항상 성공합니다.

unsigned int PyType_ClearCache()
…의 일부 안정 ABI.

내부 조회 캐시를 지웁니다. 현재의 버전 태그를 반환합니다.

unsigned long PyType_GetFlags(PyTypeObject *type)
…의 일부 안정 ABI.

typetp_flags 멤버를 반환합니다. 이 함수는 주로 Py_LIMITED_API와 함께 사용하기 위한 것입니다; 개별 플래그 비트는 파이썬 배포 간에 안정적인 것으로 보장되지만, tp_flags 자체에 대한 액세스는 제한된 API 일부가 아닙니다.

Added in version 3.2.

버전 3.4에서 변경: 반환형은 이제 long이 아니라 unsigned long입니다.

PyObject *PyType_GetDict(PyTypeObject *type)

타입 객체의 내부 네임스페이스를 반환합니다. 이 공간은 평소에 읽기 전용 프록시(cls.__dict__)를 통해서만 노출됩니다. 이는 tp_dict 에 직접 접근하는 것을 대체합니다. 반환된 딕셔너리는 읽기 전용으로 취급해야 합니다.

이 함수는 딕셔너리에 대한 직접적인 접근이 필요하고 간접 접근(예: 프록시나 PyObject_GetAttr() 을 통한 접근)이 충분하지 않은 특정 임베딩 및 언어 바인딩 사례를 위해 제작되었습니다.

확장 모듈은 자체 유형을 설정할 때 직접 또는 간접적으로 tp_dict 를 계속 사용해야 합니다.

Added in version 3.12.

void PyType_Modified(PyTypeObject *type)
…의 일부 안정 ABI.

형과 그것의 모든 서브 형에 대한 내부 검색 캐시를 무효로 합니다. 형의 어트리뷰트나 베이스 클래스를 수동으로 수정한 후에는 이 함수를 호출해야 합니다.

int PyType_AddWatcher(PyType_WatchCallback callback)

타입 감시자로 callback 을 등록합니다. 향후 PyType_Watch() 호출 시 전달해야 하는 음이 아닌 정수 ID를 반환합니다. 오류 발생 시(예: 더 이상 사용 가능한 감시자 ID가 없는 경우) -1 을 반환하고 예외를 설정합니다.

멀티스레딩 빌드에서 PyType_AddWatcher() 는 스레드 안전하지 않으므로, 시작 시(첫 번째 스레드를 생성하기 전)에 호출되어야 합니다.

Added in version 3.12.

int PyType_ClearWatcher(int watcher_id)

watcher_id 로 식별된 감시자를 제거합니다. (watcher_id 는 이전에 PyType_AddWatcher() 에서 반환된 값입니다.) 성공 시 0 을, 오류 시(예를 들어 watcher_id 가 등록된 적이 없는 경우) -1 을 반환하고 예외를 설정합니다.

확장 모듈은 이전에 PyType_AddWatcher() 호출을 통해 자신에게 제공되지 않은 watcher_idPyType_ClearWatcher 를 호출해서는 안 됩니다.

Added in version 3.12.

int PyType_Watch(int watcher_id, PyObject *type)

type 을 감시 대상으로 표시합니다. PyType_AddWatcher() 에 의해 부여된 watcher_id 가 있는 콜백은 PyType_Modified()type 의 변경을 보고할 때마다 호출됩니다. (수정 사이에 type 에 대해 _PyType_Lookup() 이 호출되지 않는 경우, 연속적인 일련의 수정에 대해서도 콜백이 단 한 번만 호출될 수 있습니다. 이는 구현 세부 사항이며 변경될 수 있습니다.)

감시 대상인 힙 타입이 해제될 때도 콜백이 호출됩니다.

확장 모듈은 이전에 PyType_AddWatcher() 호출을 통해 자신에게 제공되지 않은 watcher_idPyType_Watch 를 호출해서는 안 됩니다.

Added in version 3.12.

버전 3.15에서 변경: 이제 감시 대상인 힙 타입이 해제될 때도 콜백이 호출됩니다.

int PyType_Unwatch(int watcher_id, PyObject *type)

type 을 감시 대상이 아니라고 표시합니다. 이 작업은 이전의 PyType_Watch() 호출을 취소합니다. typeNULL 이 아니어야 합니다.

확장 모듈은 이전에 PyType_AddWatcher() 호출을 통해 자신에게 제공되지 않은 watcher_id 로 이 함수를 호출해서는 안 됩니다.

성공 시 이 함수는 0 을 반환합니다. 실패 시 예외를 설정하고 -1 을 반환합니다.

Added in version 3.12.

typedef int (*PyType_WatchCallback)(PyObject *type)

타입 감시 콜백 함수의 타입입니다.

콜백은 type 을 수정하거나, type 또는 MRO에 있는 어떤 유형에 대해서도 PyType_Modified() 가 호출되게 해서는 안 됩니다. 이 규칙을 위반하면 무한 재귀가 발생할 수 있습니다.

콜백은 타입 해제 중에 호출될 수 있습니다. 이 경우, 타입 객체가 일시적으로 부활하며(참조 횟수가 최소 1임) 모든 속성이 여전히 유효합니다. 그러나 콜백이 타입에 대한 새로운 강한 참조를 저장해서는 안 됩니다. 그렇게 하면 객체가 다시 활성화되어 해제가 방해될 수 있습니다.

Added in version 3.12.

버전 3.15에서 변경: 이제 감시 대상인 힙 타입의 해제 과정 중에 콜백이 호출될 수 있습니다.

int PyType_HasFeature(PyTypeObject *o, int feature)

형 객체 o가 기능 feature를 설정하면 0이 아닌 값을 반환합니다. 형 기능은 단일 비트 플래그로 표시됩니다.

int PyType_FastSubclass(PyTypeObject *type, int flag)

타입 객체 type 이 서브 클래스 플래그 flag 를 설정한 경우 0이 아닌 값을 반환합니다. 서브 클래스 플래그는 Py_TPFLAGS_*_SUBCLASS 로 표시됩니다. 이 함수는 일반적인 타입들에 대한 여러 _Check 함수에서 사용됩니다.

더 보기

서브 클래스 플래그가 없는 유형에 대해 _Check 함수에서 더 느린 대안으로 사용되는 PyObject_TypeCheck() 입니다.

int PyType_IS_GC(PyTypeObject *o)

형 객체가 순환 검출기에 대한 지원을 포함하고 있으면 참을 반환합니다. 이것은 형 플래그 Py_TPFLAGS_HAVE_GC를 검사합니다.

int PyType_IsSubtype(PyTypeObject *a, PyTypeObject *b)
…의 일부 안정 ABI.

ab의 서브 형이면 참을 반환합니다.

이 함수는 실제 서브 형만 검사합니다. 즉, __subclasscheck__()b에 대해 호출되지 않습니다. issubclass()가 수행하는 것과 같은 검사를 하려면 PyObject_IsSubclass()를 호출하십시오.

PyObject *PyType_GenericAlloc(PyTypeObject *type, Py_ssize_t nitems)
반환값: 새 참조. …의 일부 안정 ABI.

타입 객체의 tp_alloc 슬롯에 대한 일반 핸들러입니다. 새로운 인스턴스를 위해 메모리를 할당할 때 Python의 기본 메모리 할당 방식을 사용하고, 메모리를 0으로 채운 다음, PyObject_Init() 또는 PyObject_InitVar() 를 호출한 것처럼 메모리를 초기화합니다.

객체를 위한 메모리를 할당하기 위해 이 함수를 직접 호출하지 마십시오. 대신 해당 형의 tp_alloc 슬롯을 호출하십시오.

가비지 컬렉션을 지원하는 유형(즉, Py_TPFLAGS_HAVE_GC 플래그가 설정된 경우), 이 함수는 PyObject_GC_New 또는 PyObject_GC_NewVar 와 유사하게 동작하며(초기화 전에 메모리가 0으로 채워짐이 보장됨), tp_free 에서 PyObject_GC_Del() 과 짝을 이루어야 합니다. 그렇지 않은 경우, 이 함수는 PyObject_New 또는 PyObject_NewVar 와 유사하게 동작하며(초기화 전에 메모리가 0으로 채워짐이 보장됨), tp_free 에서 PyObject_Free() 와 짝을 이루어야 합니다.

PyObject *PyType_GenericNew(PyTypeObject *type, PyObject *args, PyObject *kwds)
반환값: 새 참조. …의 일부 안정 ABI.

타입 객체의 tp_new 슬롯에 대한 일반적인 핸들러입니다. 타입의 tp_alloc 슬롯을 사용하여 새 인스턴스를 생성하고 결과로 나온 객체를 반환합니다.

int PyType_Ready(PyTypeObject *type)
…의 일부 안정 ABI.

형 개체를 마무리합니다. 초기화를 완료하려면 모든 형 객체에 대해 이 메서드를 호출해야 합니다. 이 함수는 형의 베이스 클래스에서 상속된 슬롯을 추가합니다. 성공 시 0을 반환하고, 오류 시 -1을 반환하고 예외를 설정합니다.

참고

기본 클래스 중 일부가 GC 프로토콜을 구현하고 제공된 타입이 플래그에 Py_TPFLAGS_HAVE_GC 를 포함하지 않는 경우, GC 프로토콜은 부모로부터 자동으로 구현됩니다. 반대로 생성되는 타입이 플래그에 Py_TPFLAGS_HAVE_GC 를 포함하는 경우, 해당 타입은 최소한 tp_traverse 핸들러를 구현함으로써 스스로 GC 프로토콜을 구현해야 합니다.

PyObject *PyType_GetName(PyTypeObject *type)
반환값: 새 참조. …의 일부 안정 ABI 버전 3.11 이후로.

타입의 이름을 반환합니다. 타입의 __name__ 어트리뷰트를 가져오는 것과 동일합니다.

Added in version 3.11.

PyObject *PyType_GetQualName(PyTypeObject *type)
반환값: 새 참조. …의 일부 안정 ABI 버전 3.11 이후로.

타입의 정규화된 이름을 반환합니다. 타입의 __qualname__ 어트리뷰스를 가져오는 것과 동일합니다.

Added in version 3.11.

PyObject *PyType_GetFullyQualifiedName(PyTypeObject *type)
…의 일부 안정 ABI 버전 3.13 이후로.

타입의 전체 경로가 포함된 이름을 반환합니다. f"{type.__module__}.{type.__qualname__}" 와 동일하며, type.__module__ 이 문자열이 아니거나 "builtins" 와 같은 경우 type.__qualname__ 을 반환합니다.

Added in version 3.13.

PyObject *PyType_GetModuleName(PyTypeObject *type)
…의 일부 안정 ABI 버전 3.13 이후로.

타입의 모듈 이름을 반환합니다. type.__module__ 어트리뷰스를 가져오는 것과 동일합니다.

Added in version 3.13.

void *PyType_GetSlot(PyTypeObject *type, int slot)
…의 일부 안정 ABI 버전 3.4 이후로.

지정된 슬롯에 저장된 함수 포인터를 반환합니다. 결과가 NULL이면, 슬롯이 NULL이거나 함수가 유효하지 않은 매개 변수로 호출되었음을 나타냅니다. 호출자는 일반적으로 결과 포인터를 적절한 함수 형으로 캐스팅합니다.

slot 인자의 가능한 값은 PyType_Slot.slot을 참조하십시오.

Added in version 3.4.

버전 3.10에서 변경: PyType_GetSlot() 은 이제 모든 유형을 수용할 수 있습니다. 이전에는 heap types 로 제한되었습니다.

PyObject *PyType_GetModule(PyTypeObject *type)
반환값: 빌린 참조. …의 일부 안정 ABI 버전 3.10 이후로.

PyType_FromModuleAndSpec()를 사용하여 형을 만들 때 지정된 형과 관련된 모듈 객체를 반환합니다.

반환되는 참조는 type 으로부터 받은 borrowed 이며, type 에 대한 참조를 보유하는 동안 유효합니다. Py_DECREF() 또는 유사한 함수로 이를 해제하지 마십시오.

주어진 형과 연관된 모듈이 없으면, TypeError를 설정하고 NULL을 반환합니다.

이 함수는 일반적으로 메서드가 정의된 모듈을 가져오는 데 사용됩니다. 이러한 메서드에서 PyType_GetModule(Py_TYPE(self)) 가 의도한 결과를 반환하지 않을 수 있음에 유의하십시오. Py_TYPE(self) 는 의도한 클래스의 서브클래스 일 수 있으며, 서브클래스가 반드시 슈퍼클래스와 동일한 모듈에 정의되는 것은 아닙니다. 메서드를 정의하는 클래스를 가져오려면 PyCMethod 를 참조하십시오. PyCMethod 를 사용할 수 없는 경우의 처리에 대해서는 PyType_GetModuleByToken() 을 참조하십시오.

Added in version 3.9.

void *PyType_GetModuleState(PyTypeObject *type)
…의 일부 안정 ABI 버전 3.10 이후로.

주어진 형과 관련된 모듈 객체의 상태를 반환합니다. PyType_GetModule() 결과에 PyModule_GetState()를 호출하는 바로 가기입니다.

주어진 형과 연관된 모듈이 없으면, TypeError를 설정하고 NULL을 반환합니다.

type에 연관된 모듈이 있지만, 상태가 NULL이면, 예외를 설정하지 않고 NULL을 반환합니다.

Added in version 3.9.

PyObject *PyType_GetModuleByToken(PyTypeObject *type, const void *mod_token)
반환값: 새 참조. …의 일부 안정 ABI 버전 3.15 이후로.

주어진 module token 을 가진 모듈을 포함하는 첫 번째 슈퍼클래스를 찾아 해당 모듈을 반환합니다.

모듈을 찾을 수 없으면, TypeError를 발생시키고 NULL을 반환합니다.

이 함수는 슬롯 메서드(예: tp_init 또는 nb_add) 및 다른 위치에서, PyCMethod 호출 규약을 사용하여 메서드의 정의 클래스를 전달할 수 없는 경우에 PyModule_GetState() 와 함께 사용하도록 설계되었습니다.

Added in version 3.15.

PyObject *PyType_GetModuleByDef(PyTypeObject *type, struct PyModuleDef *def)
반환값: 빌린 참조. …의 일부 안정 ABI 버전 3.13 이후로.

주어진 PyModuleDef def 에서 생성되었거나, 혹은 module tokendef 와 동일한 모듈을 가진 첫 번째 슈퍼클래스를 찾아 해당 모듈을 반환합니다.

PyModuleDef 에서 생성된 모듈은 항상 그 토큰이 PyModuleDef 의 주소로 설정된다는 점에 유의하십시오. 즉, 이 함수는 다음을 제외하면 PyType_GetModuleByToken() 과 동일합니다.

  • borrowed reference를 반환하며,

  • C 언어에서 외형상 차이인 비-void* 인자 유형을 가집니다.

반환되는 참조는 type 으로부터 받은 borrowed 이며, type 에 대한 참조를 보유하는 동안 유효합니다. Py_DECREF() 또는 유사한 함수로 이를 해제하지 마십시오.

Added in version 3.11.

int PyType_GetBaseByToken(PyTypeObject *type, void *tp_token, PyTypeObject **result)
…의 일부 안정 ABI 버전 3.14 이후로.

typemethod resolution order 내에서 Py_tp_token 토큰이 tp_token 과 일치하는 첫 번째 슈퍼클래스를 찾습니다.

  • 찾은 경우, *result 을 해당 객체에 대한 새로운 strong reference 로 설정하고 1 을 반환합니다.

  • 찾지 못한 경우, *resultNULL 로 설정하고 0 을 반환합니다.

  • 오류 발생 시, *resultNULL 로 설정하고 예외를 설정한 상태에서 -1 을 반환합니다.

result 인자는 NULL 일 수 있으며, 이 경우 *result 는 설정되지 않습니다. 반환 값만 필요한 경우에 이 옵션을 사용하십시오.

tp_token 인자는 NULL 이 아니어야 합니다.

Added in version 3.14.

int PyUnstable_Type_AssignVersionTag(PyTypeObject *type)
이것은 불안정 API. 마이너 릴리스에서 예고 없이 변경될 수 있습니다.

주어진 형에 버전 태그를 할당하려고 시도합니다.

형이 이미 유효한 버전 태그를 가지고 있거나 새 태그가 할당된 경우 1을 반환하고, 새 태그를 할당할 수 없는 경우 0을 반환합니다.

Added in version 3.12.

int PyType_SUPPORTS_WEAKREFS(PyTypeObject *type)

type 의 인스턴스가 약한 참조(weak reference) 생성을 지원하면 True를, 그렇지 않으면 False를 반환합니다. 이 함수는 항상 성공하며, typeNULL 이 아니어야 합니다.

힙에 할당된 형 만들기

다음 함수는 heap types 를 생성하는 데 사용됩니다:

PyObject *PyType_FromSlots(const PySlot *slots)
…의 일부 안정 ABI 버전 3.15 이후로.

PySlot 배열로부터 heap type 를 생성하고 반환합니다. 슬롯에 대한 일반적인 정보는 정의 슬롯 를, 타입 생성에 특화된 슬롯은 타입 슬롯 ID 를 참조하십시오.

이 함수는 새로운 형에 PyType_Ready()를 호출합니다.

이 함수가 type() 를 호출하거나 class 구문을 사용하는 것과 동작이 완전히 일치하지 않는다는 점에 유의하십시오. 사용자가 제공한 기본 형이나 메타클래스가 있는 경우, PyType_From* 함수보다 calling type (또는 메타클래스)을 사용하는 것을 권장합니다. 구체적으로:

  • __new__() 이 새 클래스에서 호출되지 않습니다(그리고 그것은 type.__new__ 로 설정되어야 합니다).

  • __init__() 이 새 클래스에서 호출되지 않습니다.

  • __init_subclass__() 이 어떤 베이스에서도 호출되지 않습니다.

  • __set_name__() 가 새 디스크립터에서 호출되지 않습니다.

슬롯은 일반적으로 전역 정적 상수 배열로 정의됩니다. 그러나 때때로 슬롯 값이 컴파일 타임에 정적으로 알 수 없는 경우가 있습니다. 예를 들어, Py_tp_bases, Py_tp_metaclass, 그리고 Py_tp_module 과 같은 슬롯은 활성화된 파이썬 객체를 필요로 합니다. 이 경우 해당 슬롯을 스택에 배치하고, 정적 슬롯 배열을 참조하기 위해 Py_slot_subslots 를 사용할 것을 권장합니다. 예시:

static const PySlot my_slots[] = {
   PySlot_STATIC_DATA(Py_tp_name, "MyClass"),
   PySlot_FUNC(Py_tp_repr, my_repr_func),
   ...
   PySlot_END
};

PyObject *make_my_class(PyObject *module) {
   PySlot all_slots[] = {
      PySlot_STATIC_DATA(Py_slot_subslots, my_slots),
      PySlot_DATA(Py_tp_module, module),
      PySlot_END
   };
   return PyType_FromSlots(all_slots);
}

Py_TPFLAGS_IMMUTABLETYPE 플래그 없이 생성된 힙 형은 파이썬 코드에서 정의된 클래스와 마찬가지로 속성을 설정하는 등 수정될 수 있습니다. 때때 형을 완전히 초기화하기 위해 이러한 수정이 필요할 수도 있지만, 초기화 완료 후 사용자가 형을 변경하는 것을 방지하고 싶을 수도 있습니다.

int PyType_Freeze(PyTypeObject *type)
…의 일부 안정 ABI 버전 3.14 이후로.

형을 불변으로 만드려면: Py_TPFLAGS_IMMUTABLETYPE 플래그를 설정하십시오.

type 의 모든 기본 클래스는 불변이어야 합니다.

성공 시 0 을 반환합니다. 오류 시 예외를 설정하고 -1 을 반환합니다.

형이 불변으로 바뀌기 전에 사용되어서는 안 됩니다. 예를 들어, 형이 불변으로 설정되기 전에 해당 형의 인스턴스가 생성되어서는 안 됩니다.

Added in version 3.14.

타입 슬롯 ID

대부분의 타입 슬롯 ID는 PyTypeObject, PyNumberMethods, PySequenceMethods, PyMappingMethodsPyAsyncMethods 구조체의 필드 이름에 Py_ 접두사를 붙인 것과 같은 이름을 가집니다. 예를 들어, 다음을 사용하십시오:

다음 슬롯들은 슬롯으로 지정될 때 추가적인 고려 사항이 필요합니다:

추가 슬롯은 PyTypeObject 구조체 필드와 직접적으로 대응되지 않습니다:

다음 “offset” 필드는 PyType_Slot을 사용하여 설정할 수 없습니다:

MANAGED 플래그로 전환이 불가능한 경우(예: vectorcall용 또는 3.12 이전의 파이썬 지원을 위해), Py_tp_members 에 오프셋을 지정하십시오. 자세한 내용은 PyMemberDef documentation 를 참조하십시오.

다음 내부 필드들은 힙 형을 생성할 때 전혀 설정될 수 없습니다:

Py_tp_base 슬롯은 Py_tp_bases 와 동일하며, 둘 다 형 또는 형의 튜플로 설정될 수 있습니다. 둘 다 지정된 경우 Py_tp_bases 의 값이 사용됩니다.

슬롯 값은 다음을 제외하고는 NULL 이 될 수 없습니다:

버전 3.9에서 변경: PyBufferProcs의 슬롯은 제한 없는 API에서 설정할 수 있습니다.

버전 3.11에서 변경: PyBufferProcs.bf_getbufferPyBufferProcs.bf_releasebuffer 는 이제 limited API 아래에서 사용할 수 있습니다.

버전 3.14에서 변경: PyTypeObject.tp_vectorcall 필드는 이제 Py_tp_vectorcall 을 사용하여 설정할 수 있습니다. 자세한 내용은 해당 필드의 문서를 참조하십시오.

버전 3.15에서 변경: Py_tp_bases 슬롯은 단일 형 객체로 설정될 수 있으며, 이 경우 Py_tp_base 슬롯과 동일해집니다. 이전에는 형의 튜플이 필요했습니다.

다음 슬롯들은 기본 타입 구조체의 필드에 해당하지만, 슬롯으로 사용될 때 추가적인 주의 사항이 필요합니다:

Py_tp_name
…의 일부 안정 ABI 버전 3.15 이후로.

Slot ID for the name of the type, used to set PyTypeObject.tp_name.

이 슬롯(또는 PyType_Spec.name)은 형을 생성하는 데 필수적입니다.

이것은 PyType_Spec.slots 에서 사용될 수 없습니다. 대신 PyType_Spec.name 을 사용하십시오.

CPython은 슬롯을 순차적으로 처리합니다. 나중에 나오는 슬롯의 처리가 실패할 경우 오류 메시지에 이름을 포함할 수 있도록, Py_tp_name 을 슬롯 배열의 맨 앞에 두는 것을 권장합니다.

Added in version 3.15.

Py_tp_basicsize
…의 일부 안정 ABI 버전 3.15 이후로.

바이트 단위 인스턴스 크기를 위한 Slot ID 입니다. 이는 PyTypeObject.tp_basicsize 를 설정하는 데 사용됩니다.

값은 양수여야 합니다.

이것은 PyType_Spec.slots 에서 사용할 수 없습니다. 대신 PyType_Spec.basicsize 를 사용하십시오.

이 슬롯은 PyType_GetSlot() 과 함께 사용할 수 없습니다. 필요한 경우 대신 PyTypeObject.tp_basicsize 를 사용하십시오. 다만, 형(type)의 크기는 종종 구현 세부 사항으로 간주된다는 점에 유의하십시오.

Added in version 3.15.

Py_tp_extra_basicsize
…의 일부 안정 ABI 버전 3.15 이후로.

바이트 단위의 형 데이터 크기, 즉 클래스 인스턴스가 슈퍼클래스를 위해 필요한 공간에 추가로 필요로 하는 공간에 대한 Slot ID.

이 값은 슈퍼클래스의 크기와 함께 사용되어 PyTypeObject.tp_basicsize 를 설정합니다. 파이썬은 tp_basicsize 의 정렬 요구 사항을 충족하기 위해 필요한 경우 패딩(padding)을 삽입합니다.

이러한 방식으로 예약된 서브클래스 전용 메모리에 대한 포인터를 가져오려면 PyObject_GetTypeData() 를 사용하십시오.

이 값은 양수여야 합니다. 인스턴스가 추가적인 크기를 필요로 하지 않음을 지정하려면(즉, 크기가 상속되어야 하는 경우), 해당 슬롯을 0으로 설정하는 대신 Py_tp_extra_basicsize 슬롯을 생략하십시오.

Py_tp_basicsizePy_tp_extra_basicsize 를 모두 지정하는 것은 오류입니다.

이것은 PyType_Spec.slots 에서 사용할 수 없습니다. 대신 음수 값의 PyType_Spec.basicsize 를 사용하십시오.

이 슬롯은 PyType_GetSlot() 과 함께 사용할 수 없습니다.

Added in version 3.15.

Py_tp_itemsize
…의 일부 안정 ABI 버전 3.15 이후로.

바이트 단위의 가변 크기 형의 한 요소의 크기에 대한 Slot ID 입니다. PyTypeObject.tp_itemsize 를 설정하는 데 사용됩니다. 주의 사항은 tp_itemsize 문서를 참조하십시오.

값은 양수여야 합니다.

이 슬롯이 없으면 tp_itemsize 가 상속됩니다. 임의의 가변 크기 클래스를 확장하는 것은 위험합니다. 일부 형은 가변 크기 메모리에 대해 고정된 오프셋을 사용하며, 이는 서브클래스에서 사용하는 고정 크기 메모리와 겹칠 수 있기 때문입니다. 실수를 방지하기 위해, item증임 을 상속하는 것은 다음 상황에서만 가능합니다:

  • 베이스는 가변 크기가 아닙니다 (tp_itemsize 가 0임).

  • 요청된 PyType_Spec.basicsize 가 양수이며, 이는 베이스 클래스의 메모리 구조가 알려져 있음을 시사합니다.

  • 요청된 PyType_Spec.basicsize 가 0이며, 이는 서브클래스가 인스턴스의 메모리에 직접 접근하지 않음을 시사합니다.

  • Py_TPFLAGS_ITEMS_AT_END 플래그와 함께 사용됩니다.

이것은 PyType_Spec.slots 에서 사용할 수 없습니다. 대신 PyType_Spec.itemsize 를 사용하십시오.

이 슬롯은 PyType_GetSlot() 과 함께 사용할 수 없습니다.

Added in version 3.15.

Py_tp_flags
…의 일부 안정 ABI 버전 3.15 이후로.

PyTypeObject.tp_flags 를 설정하는 데 사용되는 형 플래그에 대한 Slot ID 입니다.

Py_TPFLAGS_HEAPTYPE 플래그가 설정되어 있지 않으면, PyType_FromSpecWithBases() 가 이를 자동으로 설정합니다.

이것은 PyType_Spec.slots 에서 사용할 수 없습니다. 대신 음수 값의 PyType_Spec.basicsize 를 사용하십시오.

이 슬롯은 PyType_GetSlot() 과 함께 사용할 수 없습니다. 대신 PyType_GetFlags() 를 사용하십시오.

Added in version 3.15.

Py_tp_bases
…의 일부 안정 ABI.

PyTypeObject.tp_bases 를 설정하는 데 사용되는 형 플래그에 대한 Slot ID 입니다.

이 슬롯은 새로 생성된 형이 상속해야 하는 형 객체의 튜플로 설정될 수 있으며, 이는 파이썬 class definition 의 “위치 인자(positional arguments)”와 유사합니다.

대신, 이 슬롯을 단일 형 객체로 설정하여 단일 베이스를 지정할 수도 있습니다. 이 경우 한 개의 요소가 포함된 튜플을 지정하는 것과 동일한 효과를 가집니다.

버전 3.15에서 변경: 이전에는 Py_tp_bases 가 형의 튜플을 요구했습니다.

Py_tp_base
…의 일부 안정 ABI.

Py_tp_bases (끝에 s 포함)와 동일합니다. 둘 다 지정된 경우, Py_tp_bases 가 우선하며 이 슬롯은 무시됩니다.

버전 3.15에서 변경: 이전에는 Py_tp_base 가 튜플이 아닌 단일 형을 요구했습니다.

버전 3.15부터 약하게 폐지 <Soft deprecated>: 구버전 파이썬을 대상으로 하지 않는 경우, Py_tp_bases 를 선호하십시오.

다음 슬롯들은 기본 구조체 내의 공개 필드에 해당하지 않습니다:

Py_tp_metaclass
…의 일부 안정 ABI 버전 3.15 이후로.

결과형 객체를 생성하는 데 사용되는 메타클래스에 대한 Slot ID 입니다. 생략된 경우 메타클래스는 베이스(Py_tp_bases 또는 PyType_FromMetaclass()bases 인자)에서 파생됩니다.

tp_newNULL 인 경우를 제외하고, tp_new 를 재정의하는 메타클래스는 지원되지 않습니다.

이것은 PyType_Spec.slots 에서 사용할 수 없습니다. PyType_Spec 으로 메타클래스를 지정하려면 PyType_FromMetaclass() 를 사용하십시오.

이 슬롯은 PyType_GetSlot() 과 함께 사용할 수 없습니다. 대신 형 객체에서 Py_TYPE() 을 사용하십시오.

Added in version 3.15.

Py_tp_module
…의 일부 안정 ABI 버전 3.15 이후로.

새 클래스가 정의된 모듈을 기록하기 위한 Slot ID 입니다.

이 값은 모듈 객체여야 합니다. 해당 모듈은 새 형과 연결되며 나중에 PyType_GetModule() 로 가져올 수 있습니다. 연결된 모듈은 서브 클래스에 상속되지 않으며, 각 클래스마다 개별적으로 지정해야 합니다.

이것은 PyType_Spec.slots 에서 사용할 수 없습니다. PyType_Spec 으로 모듈을 지정하려면 PyType_FromMetaclass() 를 사용하십시오.

이 슬롯은 PyType_GetSlot() 과 함께 사용할 수 없습니다. 대신 PyType_GetModule() 을 사용하십시오.

Added in version 3.15.

Py_tp_token
…의 일부 안정 ABI 버전 3.14 이후로.

클래스의 정적 메모 구조 ID를 기록하기 위한 Slot ID 입니다.

클래스가 PyType_Spec 을 사용하여 정의되고 해당 사양(spec)이 정적으로 할당된 경우, 특수 값 Py_TP_USE_SPEC 을 사용하여 해당 사양으로 토큰을 설정할 수 있습니다.

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

또한 임의의 포인터로 설정할 수 있지만, 다음 사항을 보장해야 합니다:

  • 포인터가 클래스보다 오래 유지되어야 하며, 클래스가 존재하는 동안 다른 용도로 재사용되지 않아야 합니다.

  • 해당 포인터는 클래스가 위치한 확장 모듈에 “속해” 있어야 하므로 다른 확장 프로그램과 충돌하지 않습니다.

클래스의 슈퍼클래스가 특정 토큰을 가지고 있는지(즉, 메모리 구조가 호환되는지) 확인하려면 PyType_GetBaseByToken() 을 사용하십시오.

특정 클래스의 토큰을 가져오려면(슈퍼클래스 고려 안 함) Py_tp_token 과 함께 PyType_GetSlot() 을 사용하십시오.

Added in version 3.14.

Py_TP_USE_SPEC
…의 일부 안정 ABI 버전 3.14 이후로.

Py_tp_token 과 함께 사용하여 토큰을 해당 클래스의 PyType_Spec 으로 설정하는 데 사용됩니다. PyType_Spec 을 사용하여 정의된 클래스에만 사용할 수 있습니다.

NULL 로 확장됩니다.

Added in version 3.14.

Py_tp_slots
…의 일부 안정 ABI 버전 3.15 이후로.

Py_slot_subslots 와 유사하게 작동하지만, PyType_Slot 구조체 배열을 지정하는 Slot ID 입니다.

Added in version 3.15.

소프트 폐지(Soft-deprecated)된 API

다음 함수들은 약하게 폐지된 상태입니다. 계속 작동은 하지만, 새로운 기능은 PyType_FromSlots() 를 위한 슬롯으로 추가되며 새 PyType_From* 함수들의 인자로 추가되지 않습니다.

PyObject *PyType_FromMetaclass(PyTypeObject *metaclass, PyObject *module, PyType_Spec *spec, PyObject *bases)
…의 일부 안정 ABI 버전 3.12 이후로.

spec으로 힙 형을 만들고 반환합니다 (Py_TPFLAGS_HEAPTYPE을 찹고하세요).

비어 있지 않은(non-NULL) metaclass 인자는 Py_tp_metaclass 슬롯에 대응합니다.

비어 있지 않은(non-NULL) bases 인자는 Py_tp_bases 슬롯에 대응하며, Py_tp_basesPy_tp_bases 슬롯보다 우선합니다.

비어 있지 않은(non-NULL) module 인자는 Py_tp_module 슬롯에 대응합니다.

이 함수는 새로운 형에 PyType_Ready()를 호출합니다.

이 함수가 type() 호출이나 class 문을 사용하는 것과 완전히 동일한 동작을 하지 않는다는 점에 유의하십시오. 자세한 내용은 PyType_FromSlots() 문서의 참고 사항을 확인하십시오.

Added in version 3.12.

버전 3.16.0a0 (unreleased)부터 약하게 폐지 <Soft deprecated>: 새 코드에서는 PyType_FromSlots() 를 선호하십시오.

PyObject *PyType_FromModuleAndSpec(PyObject *module, PyType_Spec *spec, PyObject *bases)
반환값: 새 참조. …의 일부 안정 ABI 버전 3.10 이후로.

PyType_FromMetaclass(NULL, module, spec, bases)와 동등합니다.

Added in version 3.9.

버전 3.10에서 변경: 이제 이 함수는 bases 인자로 단일 클래스를 수용하고, tp_doc 슬롯으로 NULL 을 받습니다.

버전 3.12에서 변경: 이 함수는 이제 제공된 베이스 클래스에 해당하는 메타클래스를 찾아 사용합니다. 이전에는 type 인스턴스만 반환되었습니다.

메타클래스의 tp_new무시되며, 이로 인해 초기화가 불완전해질 수 있습니다. 메타클래스가 tp_new 를 재정의하는 형을 생성하는 것은 폐지되었습니다.

버전 3.14에서 변경: 메타클래스가 tp_new 를 재정의하는 형을 만드는 것이 더 이상 허용되지 않습니다.

버전 3.16.0a0 (unreleased)부터 약하게 폐지 <Soft deprecated>: 새 코드에서는 PyType_FromSlots() 를 선호하십시오.

PyObject *PyType_FromSpecWithBases(PyType_Spec *spec, PyObject *bases)
반환값: 새 참조. …의 일부 안정 ABI 버전 3.3 이후로.

PyType_FromMetaclass(NULL, NULL, spec, bases)와 동등합니다.

Added in version 3.3.

버전 3.12에서 변경: 이 함수는 이제 제공된 베이스 클래스에 해당하는 메타클래스를 찾아 사용합니다. 이전에는 type 인스턴스만 반환되었습니다.

메타클래스의 tp_new무시되며, 이로 인해 초기화가 불완전해질 수 있습니다. 메타클래스가 tp_new 를 재정의하는 형을 생성하는 것은 폐지되었습니다.

버전 3.14에서 변경: 메타클래스가 tp_new 를 재정의하는 형을 만드는 것이 더 이상 허용되지 않습니다.

버전 3.16.0a0 (unreleased)부터 약하게 폐지 <Soft deprecated>: 새 코드에서는 PyType_FromSlots() 를 선호하십시오.

PyObject *PyType_FromSpec(PyType_Spec *spec)
반환값: 새 참조. …의 일부 안정 ABI.

PyType_FromMetaclass(NULL, NULL, spec, NULL)와 동등합니다.

버전 3.12에서 변경: 이 함수는 이제 Py_tp_base[s] 슬롯에 제공된 베이스 클래스에 해당하는 메타클래스를 찾아 사용합니다. 이전에는 type 인스턴스만 반환되었습니다.

메타클래스의 tp_new무시되며, 이로 인해 초기화가 불완전해질 수 있습니다. 메타클래스가 tp_new 를 재정의하는 형을 생성하는 것은 폐지되었습니다.

버전 3.14에서 변경: 메타클래스가 tp_new 를 재정의하는 형을 만드는 것이 더 이상 허용되지 않습니다.

버전 3.16.0a0 (unreleased)부터 약하게 폐지 <Soft deprecated>: 새 코드에서는 PyType_FromSlots() 를 선호하십시오.

type PyType_Spec
…의 일부 안정 ABI (모든 멤버 포함).

PyType_FromMetaclass() 와 같이 약하게 폐지된 함수들을 위해 사용되는, 형의 동작을 정의하는 구조체입니다.

이 구조체에는 대신 PyType_FromSlots()\에 사용할 수 있는 여러 멤버(예컨대 slots)와 더 간단한 구조를 가진 슬롯 항목 배열이 포함되어 있습니다.

const char *name

Py_tp_name 에 해당합니다.

int basicsize

양수일 경우 Py_tp_basicsize 에 해당합니다.

음수일 경우 절댓값이 설정된 Py_tp_extra_basicsize 에 해당합니다.

버전 3.12에서 변경: 이전에는 이 필드가 음수일 수 없었습니다.

int itemsize

Py_tp_itemsize 에 해당합니다.

unsigned int flags

Py_tp_flags 에 해당합니다.

PyType_Slot *slots

PyType_Slot (이때 PySlot 아님) 구조체의 배열입니다.

특별한 슬롯 값 {0, NULL} 으로 종료됩니다. 각 슬롯 ID는 최대 한 번만 지정되어야 합니다.

type PyType_Slot
…의 일부 안정 ABI (모든 멤버 포함).

PyType_FromMetaclass() 와 같이 약하게 폐지된 함수들을 위해 사용되는, 형의 선택적 기능을 정의하는 구조체입니다.

참고로 PyType_Slot 배열이 Py_tp_slots 를 사용하는 PySlot 배열에 포함될 수 있으며, 그 반대로 Py_slot_subslots 를 사용하여 포함될 수도 있습니다.

PyType_Slot 구조체 tpslot 은 다음과 같은 PySlot 구조체로 해석됩니다:

(PySlot){
   .sl_id=tpslot.slot,
   .sl_flags=PySlot_INTPTR | sub_static,
   .sl_ptr=tpslot.func
}

여기서 sub_static 은 슬롯이 플래그를 필요로 하는 경우 (예: Py_tp_methods 의 경우) 또는 이 플래그가 “부모”인 Py_tp_slots 슬롯에 존재하는 경우 PySlot_STATIC 입니다.

int slot

PySlot.sl_id 에 해당합니다.

void *pfunc

PySlot.sl_ptr 에 해당합니다.

분실물 보관소