형 객체¶
-
PyTypeObject PyType_Type¶
- …의 일부 안정 ABI.
이것은 형 객체의 형 객체입니다; 파이썬 계층의
type과 같은 객체입니다.
-
int PyType_Check(PyObject *o)¶
객체 o가 표준형 객체에서 파생된 형의 인스턴스를 포함하여 형 객체면 0이 아닌 값을 반환합니다. 다른 모든 경우 0을 반환합니다. 이 함수는 항상 성공합니다.
-
int PyType_CheckExact(PyObject *o)¶
객체 o가 형 객체이지만, 표준형 객체의 서브 형이 아니면 0이 아닌 값을 반환합니다. 다른 모든 경우 0을 반환합니다. 이 함수는 항상 성공합니다.
-
unsigned long PyType_GetFlags(PyTypeObject *type)¶
- …의 일부 안정 ABI.
type의
tp_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_id 로PyType_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_id 로PyType_Watch를 호출해서는 안 됩니다.Added in version 3.12.
버전 3.15에서 변경: 이제 감시 대상인 힙 타입이 해제될 때도 콜백이 호출됩니다.
-
int PyType_Unwatch(int watcher_id, PyObject *type)¶
type 을 감시 대상이 아니라고 표시합니다. 이 작업은 이전의
PyType_Watch()호출을 취소합니다. type 은NULL이 아니어야 합니다.확장 모듈은 이전에
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.
a가 b의 서브 형이면 참을 반환합니다.
이 함수는 실제 서브 형만 검사합니다. 즉,
__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 이후로.
주어진
PyModuleDefdef 에서 생성되었거나, 혹은 module token 이 def 와 동일한 모듈을 가진 첫 번째 슈퍼클래스를 찾아 해당 모듈을 반환합니다.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 이후로.
type 의 method resolution order 내에서
Py_tp_token토큰이 tp_token 과 일치하는 첫 번째 슈퍼클래스를 찾습니다.찾은 경우, *result 을 해당 객체에 대한 새로운 strong reference 로 설정하고
1을 반환합니다.찾지 못한 경우, *result 을
NULL로 설정하고0을 반환합니다.오류 발생 시, *result 를
NULL로 설정하고 예외를 설정한 상태에서-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를 반환합니다. 이 함수는 항상 성공하며, type 은
NULL이 아니어야 합니다.
힙에 할당된 형 만들기¶
다음 함수는 heap types 를 생성하는 데 사용됩니다:
-
PyObject *PyType_FromSlots(const PySlot *slots)¶
- …의 일부 안정 ABI 버전 3.15 이후로.
PySlot배열로부터 heap type 를 생성하고 반환합니다. 슬롯에 대한 일반적인 정보는 정의 슬롯 를, 타입 생성에 특화된 슬롯은 타입 슬롯 ID 를 참조하십시오.이 함수는 새로운 형에
PyType_Ready()를 호출합니다.이 함수가
type()를 호출하거나class구문을 사용하는 것과 동작이 완전히 일치하지 않는다는 점에 유의하십시오. 사용자가 제공한 기본 형이나 메타클래스가 있는 경우,PyType_From*함수보다 callingtype(또는 메타클래스)을 사용하는 것을 권장합니다. 구체적으로:__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, PyMappingMethods 및 PyAsyncMethods 구조체의 필드 이름에 Py_ 접두사를 붙인 것과 같은 이름을 가집니다. 예를 들어, 다음을 사용하십시오:
PyNumberMethods.nb_add를 설정하는Py_nb_add
다음 슬롯들은 슬롯으로 지정될 때 추가적인 고려 사항이 필요합니다:
추가 슬롯은 PyTypeObject 구조체 필드와 직접적으로 대응되지 않습니다:
다음 “offset” 필드는 PyType_Slot을 사용하여 설정할 수 없습니다:
tp_weaklistoffset(가능하면 대신Py_TPFLAGS_MANAGED_WEAKREF를 사용하세요)tp_dictoffset(가능하면 대신Py_TPFLAGS_MANAGED_DICT를 사용하세요)tp_vectorcall_offset(PyMemberDef에서"__vectorcalloffset__"를 사용하세요)
MANAGED 플래그로 전환이 불가능한 경우(예: vectorcall용 또는 3.12 이전의 파이썬 지원을 위해), Py_tp_members 에 오프셋을 지정하십시오. 자세한 내용은 PyMemberDef documentation 를 참조하십시오.
다음 내부 필드들은 힙 형을 생성할 때 전혀 설정될 수 없습니다:
PyTypeObject.tp_dict,PyTypeObject.tp_mro,PyTypeObject.tp_cache,PyTypeObject.tp_subclasses, 그리고PyTypeObject.tp_weaklist.
Py_tp_base 슬롯은 Py_tp_bases 와 동일하며, 둘 다 형 또는 형의 튜플로 설정될 수 있습니다. 둘 다 지정된 경우 Py_tp_bases 의 값이 사용됩니다.
슬롯 값은 다음을 제외하고는 NULL 이 될 수 없습니다:
Py_tp_token(명확성을 위해NULL보다는Py_TP_USE_SPEC을 권장합니다)
버전 3.9에서 변경: PyBufferProcs의 슬롯은 제한 없는 API에서 설정할 수 있습니다.
버전 3.11에서 변경: PyBufferProcs.bf_getbuffer 및 PyBufferProcs.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 IDfor the name of the type, used to setPyTypeObject.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_basicsize와Py_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_new가NULL인 경우를 제외하고,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_bases및Py_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에 해당합니다.
-
int slot¶
-
type PyType_Slot¶
-
const char *name¶