형 객체¶
-
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__)를 통해서만 노출됩니다. 이것은 :c:member:`~PyTypeObject.tp_dict`에 직접 접근하는 것을 대체합니다. 반환된 딕셔너리는 읽기 전용으로 취급해야 합니다.이 함수는 딕셔너리에 대한 직접적인 접근이 필수적이고 간접적인 접근(예: 프록시 또는
PyObject_GetAttr())으로는 불충분한 특정 임베딩 및 언어 바인딩 사례를 위해 предназначены합니다.확장 모듈은 자체 타입을 설정할 때, 직접적이든 간접적이든
tp_dict를 계속 사용해야 합니다.Added in version 3.12.
-
void PyType_Modified(PyTypeObject *type)¶
- 상의 안정 ABI.
형과 그것의 모든 서브 형에 대한 내부 검색 캐시를 무효로 합니다. 형의 어트리뷰트나 베이스 클래스를 수동으로 수정한 후에는 이 함수를 호출해야 합니다.
-
int PyType_AddWatcher(PyType_WatchCallback callback)¶
[msgid] Register callback as a type watcher. Return a non-negative integer ID which must be passed to future calls to
PyType_Watch(). In case of error (e.g. no more watcher IDs available), return-1and set an exception.플리 스레드 빌드에서는 :c:func:`PyType_AddWatcher`가 스레드에 안전하지 않으므로, 시작 시(첫 번째 스레드를 생성하기 전에) 호출해야 합니다.
Added in version 3.12.
-
int PyType_ClearWatcher(int 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 의 변경 사항을 보고할 때마다 호출됩니다. (만약 수정 사이에_PyType_Lookup()이 type 에 대해 호출되지 않으면, 연속적인 수정 시리즈에 대해 콜백이 한 번만 호출될 수 있습니다. 이는 구현 세부 사항이며 변경될 수 있습니다.)감시 중인 힙 타입이 해제될 때도 콜백이 호출됩니다.
확장은 이전의
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의 어떤 타입에 대해서도 :c:func:`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함수에서 사용됩니다.더 보기
PyObject_TypeCheck()는 서브클래스 플래그가 없는 타입을 위한 느린 대안으로_Check함수에서 사용됩니다.
-
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슬롯에 대한 일반 처리기입니다. 파이썬의 기본 메모리 할당 메커니즘을 사용하여 새 인스턴스에 메모리를 할당하고, 메모리에 0으로 초기화한 다음, :c:func:`PyObject_Init 또는 :c:func:`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 이후로.
타입의 한정된 이름(qualified name)을 반환합니다. 이는 타입의
__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.
-
PyObject *PyType_GetModule(PyTypeObject *type)¶
- 반환값: 빌린 참조. 상의 안정 ABI 버전 3.10 이후로.
PyType_FromModuleAndSpec()를 사용하여 형을 만들 때 지정된 형과 관련된 모듈 객체를 반환합니다.반환된 참조는 type 으로부터의 빌린 참조 이며, 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 이후로.
주어진 :ref:`module token <ext-module-token>`을 가진 모듈을 가진 첫 번째 슈퍼 클래스를 찾아 해당 모듈을 반환합니다.
모듈을 찾을 수 없으면,
TypeError를 발생시키고NULL을 반환합니다.이 함수는 스롯 메서드(예:
tp_init또는nb_add) 및 메서드를 정의하는 클래스를PyCMethod호출 규칙을 사용하여 전달할 수 없는 다른 장소에서 모듈 상태를 가져오기 위해 :c:func:`PyModule_GetState()`와 함께 사용하도록 의도되었습니다.Added in version 3.15.
-
PyObject *PyType_GetModuleByDef(PyTypeObject *type, struct PyModuleDef *def)¶
- 반환값: 빌린 참조. 상의 안정 ABI 버전 3.13 이후로.
주어진
PyModuleDefdef 에서 생성되었거나, 또는 module token 이 def 와 같은 첫 번째 슈퍼 클래스를 찾아 해당 모듈을 반환합니다.:c:type:`PyModuleDef`에서 생성된 모듈은 항상 토큰이 :c:type:`PyModuleDef`의 주소로 설정된다는 점에 유의하십시오. 즉, 이 함수는 다음을 제외하고 :c:func:`PyType_GetModuleByToken`과 동일합니다:
빌린 참조를 반환하며,
void*가 아닌 인자 타입을 가집니다 (이는 C 언어의 미관상의 차이입니다).
반환된 참조는 type 으로부터의 빌린 참조 이며, type 에 대한 참조를 보유하는 동안 유효합니다.
Py_DECREF()나 유사 함수로 해제하지 마십시오.Added in version 3.11.
-
int PyType_GetBaseByToken(PyTypeObject *type, void *tp_token, PyTypeObject **result)¶
- 상의 안정 ABI 버전 3.14 이후로.
Find the first superclass in type’s method resolution order whose
Py_tp_tokentoken is equal to tp_token.찾은 경우, *result 를 해당 객체에 대한 새로운 강한 참조 로 설정하고
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. 경고 없이 사소 버전에서 변경될 수 있습니다.
주어진 타입에 버전 태그를 할당하려고 시도합니다.
Returns 1 if the type already had a valid version tag or a new one was assigned, or 0 if a new tag could not be assigned.
Added in version 3.12.
-
int PyType_SUPPORTS_WEAKREFS(PyTypeObject *type)¶
:type 인스턴스가 약한 참조를 생성할지 여부를 true 로 반환하고, 그렇지 않으면 false 를 반환합니다. 이 함수는 항상 성공합니다. type 은
NULL이 아니어야 합니다.
힙에 할당된 형 만들기¶
다음 함수는 :ref:`힙 형 <heap-types>`을 만드는 데 사용됩니다:
-
PyObject *PyType_FromSlots(const PySlot *slots)¶
- 상의 안정 ABI 버전 3.15 이후로.
:spec 에서 힙 형 를 생성하고 반환하려면
PySlot배열을 사용합니다. 슬롯에 대한 일반 정보는 정의 슬롯 를 참조하고, 타입 생성에 특화된 슬롯은 타입 슬롯 ID 에서 확인하세요.이 함수는 새로운 형에
PyType_Ready()를 호출합니다.이 함수는
<type> <type>`을 호출하거나 :keyword:`class문을 사용하는 동작과 완전히 일치하지 않는다는 점에 유의하세요. 사용자 정의 베이스 타입이나 메타클래스를 사용할 경우,PyType_From*함수보다 callingtype(또는 메타클래스)를 우선 사용하십시오. 구체적으로 다음과 같습니다:__new__()is not called on the new class (and it must be set totype.__new__).__init__()는 새 클래스에서 호출되지 않습니다.__init_subclass__()는 어떤 베이스에서도 호출되지 않습니다.__set_name__()은 새로운 디스크립터에서 호출되지 않습니다.
슬롯은 일반적으로 전역 정적 상수 배열로 정의됩니다. 그러나 때로는 슬롯 값이 컴파일 시간에 정적으로 알려지지 않는 경우가 있습니다. 예를 들어,
Py_tp_bases,Py_tp_metaclass및 :c:data:`Py_tp_module`과 같은 슬롯은 라이브 Python 객체를 필요로 합니다. 이 경우, 이러한 슬롯을 스택에 두고 정적 슬롯 배열을 참조하려면 :c:macro:`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 플래그 없이 생성된 힙 타입은 Python 코드로 정의된 클래스처럼 속성을 설정하는 등의 방식으로 수정될 수 있습니다. 때로는 이러한 수정이 타입을 완전히 초기화하는 데 필요할 수 있지만, 사용자에게 초기화가 완료된 후 타입을 변경하지 않도록 하고 싶을 수도 있습니다:
-
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_ 접두사를 붙여 이름을 지정합니다. 예를 들어, 다음을 사용하세요:
Py_tp_dealloc을 사용하여 :c:member:`PyTypeObject.tp_dealloc`을 설정합니다Py_sq_length를 사용하여 :c:member:`PySequenceMethods.sq_length`를 설정합니다
슬롯으로 지정할 때 추가적인 고려가 필요한 슬롯은 다음과 같습니다:
추가 슬롯은 PyTypeObject 구조체의 필드와 직접적으로 일치하지 않습니다:
다음 “offset” 필드는 PyType_Slot을 사용하여 설정할 수 없습니다:
tp_weaklistoffset(가능하면 대신Py_TPFLAGS_MANAGED_WEAKREF를 사용하세요)tp_dictoffset(가능하면 대신Py_TPFLAGS_MANAGED_DICT를 사용하세요)tp_vectorcall_offset(PyMemberDef에서"__vectorcalloffset__"를 사용하세요)
만약 MANAGED 플래그로 전환할 수 없거나 (예를 들어, 벡터콜을 위해 또는 3.12 이전 Python을 지원하기 위해), :c:data:`Py_tp_members`에 오프셋을 지정합니다. 자세한 내용은 :ref:`PyMemberDef documentation <pymemberdef-offsets>`를 참조하세요.
힙 타입을 생성할 때 다음 내부 필드는 아예 설정할 수 없습니다:
Py_tp_base 슬롯은 :c:data:`Py_tp_bases`와 동일하며; 둘 다 타입 또는 타입의 튜플로 설정될 수 있습니다. 둘 다 지정된 경우, :c:data:`Py_tp_bases`의 값이 사용됩니다.
다음 슬롯 값은 NULL 일 수 없습니다:
Py_tp_token(명확성을 위해,NULL대신 :c:data:`Py_TP_USE_SPEC`이 선호됩니다)
버전 3.9에서 변경: PyBufferProcs의 슬롯은 제한 없는 API에서 설정할 수 있습니다.
버전 3.11에서 변경: :c:member:`~PyBufferProcs.bf_getbuffer`와 :c:member:`~PyBufferProcs.bf_releasebuffer`는 이제 :ref:`limited API <limited-c-api>`에서 사용할 수 있습니다.
버전 3.14에서 변경: 필드 :c:member:`~PyTypeObject.tp_vectorcall`은 이제 :c:data:`Py_tp_vectorcall`을 사용하여 설정할 수 있습니다. 자세한 내용은 해당 필드의 문서를 참고하세요.
버전 3.15에서 변경: Py_tp_bases 슬롯은 단일 타입 객체로 설정될 수 있어 Py_tp_base 슬롯과 동일합니다. 이전에는 타입의 튜플이 필요했습니다.
다음 슬롯들은 기본형 구조의 필드에 해당하지만, 슬롯으로 사용하기 위해 추가적인 설명이 필요합니다:
-
Py_tp_name¶
- 상의 안정 ABI 버전 3.15 이후로.
타입 이름에 대한 :c:member:`Slot ID <PySlot.sl_id>`가 `:c:member:`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 이후로.
인스턴스의 바이트 크기에 대한 :c:member:`Slot ID <PySlot.sl_id>`입니다. 이는 `:c:member:`PyTypeObject.tp_basicsize``를 설정하는 데 사용됩니다.
값은 양수여야 합니다.
이것을
PyType_Spec.slots에서 사용할 수 없습니다. 대신PyType_Spec.basicsize를 사용하십시오.이 슬롯은
PyType_GetSlot()과 함께 사용할 수 없습니다. 필요한 경우PyTypeObject.tp_basicsize를 대신 사용해야 하지만, 타입의 크기는 종종 구현 상세 정보로 간주된다는 점을 유념하십시오.Added in version 3.15.
-
Py_tp_extra_basicsize¶
- 상의 안정 ABI 버전 3.15 이후로.
클래스의 인스턴스가 슈퍼클래스에 필요한 공간 이외에 얼마나 많은 공간이 필요한지를 나타내는 바이트 단위의 타입 데이터 크기에 대한 :c:member:`Slot ID <PySlot.sl_id>`입니다.
이 값은 슈퍼클래스의 크기와 함께 :c:member:`PyTypeObject.tp_basicsize``를 설정하는 데 사용됩니다. 파이썬은 :c:member:!tp_basicsize`의 정렬 요구 사항을 충족하기 위해 필요한 패딩을 삽입합니다.
속성 클래스별로 예약된 메모리에 대한 포인터를 얻으려면 :c:func:`PyObject_GetTypeData``를 사용하십시오.
값은 양수여야 합니다. 인스턴스가 추가적인 크기가 필요하지 않음(즉, 크기가 상속되어야 함)을 지정하려면
Py_tp_extra_basicsize`슬롯을 0으로 설정하는 대신 생략하십시오.:c:macro:`Py_tp_basicsize``와 `:c:macro:!Py_tp_extra_basicsize``를 모두 지정하는 것은 오류입니다.
이것을
PyType_Spec.slots에서 사용할 수 없습니다. 대신 음수 값의PyType_Spec.basicsize를 사용하십시오.이 슬롯은 :c:func:`PyType_GetSlot``과 함께 사용할 수 없습니다.
Added in version 3.15.
-
Py_tp_itemsize¶
- 상의 안정 ABI 버전 3.15 이후로.
가변 크기 타입의 한 요소에 대한 바이트 크기에 대한
Slot ID입니다.PyTypeObject.tp_itemsize를 설정하는 데 사용됩니다. 주의 사항은tp_itemsize설명서를 참조하십시오.값은 양수여야 합니다.
이 슬롯이 누락되면
tp_itemsize가 상속됩니다. 임의의 가변 크기 클래스를 확장하는 것은 위험합니다. 왜냐하면 일부 타입은 고정 오프셋을 사용하여 가변 크기 메모리를 사용하며, 이는 서브클래스에서 사용되는 고정 크기 메모리와 중복될 수 있기 때문입니다. 실수를 방지하기 위해itemsize를 상속하는 것은 다음 상황에서만 가능합니다:베이스는 가변 크기가 아닙니다 (
tp_itemsize입니다).요청된 :c:member:`PyType_Spec.basicsize``는 양수이며, 기본 클래스의 메모리 레이아웃을 알고 있음을 시사합니다.
요청된 :c:member:`PyType_Spec.basicsize``은 0이며, 서브클래스가 인스턴스의 메모리에 직접 접근하지 않음을 시사합니다.
:c:macro:`Py_TPFLAGS_ITEMS_AT_END` 플래그를 사용하여 사용합니다.
이것을
PyType_Spec.slots에서 사용할 수 없습니다. 대신PyType_Spec.itemsize를 사용하십시오.이 슬롯은 :c:func:`PyType_GetSlot``과 함께 사용할 수 없습니다.
Added in version 3.15.
-
Py_tp_flags¶
- 상의 안정 ABI 버전 3.15 이후로.
`:c:member:`Slot ID <PySlot.sl_id>`입니다. `:c:member:`PyTypeObject.tp_flags``를 설정하는 데 사용되는 타입 플래그입니다.
Py_TPFLAGS_HEAPTYPE` 플래그가 설정되어 있지 않으면,PyType_FromSpecWithBases()가 자동으로 설정합니다.이것을
PyType_Spec.slots에서 사용할 수 없습니다. 대신 음수 값의PyType_Spec.basicsize를 사용하십시오.이 슬롯은
PyType_GetSlot()과 함께 사용할 수 없습니다. 대신PyType_GetFlags()를 사용하십시오.Added in version 3.15.
-
Py_tp_bases¶
- 상의 안정 ABI.
타입 플래그를 위한
Slot ID로,PyTypeObject.tp_bases를 설정하는 데 사용됩니다.이 슬롯은 새로 생성된 타입이 상속받아야 하는 타입 객체들의 튜플로 설정할 수 있으며, 이는 Python class definition 의 “위치 인수(positional arguments)”와 유사합니다.
또는 단일 기반을 지정하기 위해 이 슬롯을 단일 타입 객체로 설정할 수도 있습니다. 이는 한 개의 요소를 가진 튜플을 지정하는 것과 동일한 효과를 가집니다.
버전 3.15에서 변경: 이전에는
Py_tp_bases가 타입의 튜플을 요구했습니다.
-
Py_tp_base¶
- 상의 안정 ABI.
Equivalent to
Py_tp_bases(withsat the end). If both are specified,Py_tp_basestakes priority and this slot is ignored.버전 3.15에서 변경: 이전에는
Py_tp_base가 튜플이 아닌 단일 타입을 요구했습니다.버전 3.15부터 약하게 폐지 <Soft deprecated>: When not targetting older Python versions, pefer
Py_tp_bases.
다음 슬롯들은 기본 구조의 공개 필드에 해당하지 않습니다:
-
Py_tp_metaclass¶
- 상의 안정 ABI 버전 3.15 이후로.
결과 타입 객체를 구성하는 데 사용되는 메타클래스(metaclass)에 대한
Slot ID입니다. 생략되면 기본값에서 유도됩니다 (Py_tp_bases또는PyType_FromMetaclass()의 bases 인자).Metaclasses that override
tp_neware not supported, except iftp_newisNULL.이는
PyType_Spec.slots에서 사용되지 않을 수 있습니다. 대신PyType_FromMetaclass()를 사용하여PyType_Spec을 가진 메타클래스를 지정하십시오.이 슬롯은 :c:func:`PyType_GetSlot``과 함께 사용할 수 없습니다. 대신 타입 객체에 `:c:func:`Py_TYPE``을 사용하십시오.
Added in version 3.15.
-
Py_tp_module¶
- 상의 안정 ABI 버전 3.15 이후로.
:c:member:`Slot ID <PySlot.sl_id>`는 새 클래스가 정의된 모듈을 기록하는 데 사용됩니다.
이 값은 모듈 객체여야 합니다. 이 모듈은 새로운 타입과 연관되며, 나중에
PyType_GetModule()\를 통해 검색할 수 있습니다. 연결된 모듈은 서브 클래스에 상속되지 않으므로, 각 클래스별로 지정해야 합니다.이것은
PyType_Spec.slots\에서 사용되지 않을 수 있습니다. :c:type:`!PyType_Spec`를 가진 모듈을 지정하려면 :c:func:`PyType_FromMetaclass`를 사용하십시오.이 슬롯은
PyType_GetSlot()\와 함께 사용될 수 없습니다. 대신 :c:func:`PyType_GetModule`을 사용하십시오.Added in version 3.15.
-
Py_tp_token¶
- 상의 안정 ABI 버전 3.14 이후로.
:c:member:`Slot ID <PySlot.sl_id>`는 클래스의 정적 메모리 레이아웃 ID를 기록하는 데 사용됩니다.
클래스가
PyType_Spec\를 사용하여 정의되었고 해당 spec이 정적으로 할당된 경우, 토큰은 특수 값 :c:data:`Py_TP_USE_SPEC`을 사용하여 spec로 설정될 수 있습니다:static PyType_Slot foo_slots[] = { {Py_tp_token, Py_TP_USE_SPEC},
임의의 포인터로도 설정할 수 있지만 다음 사항을 확인해야 합니다:
포인터는 클래스보다 오래 남아 있어, 클래스가 존재하는 동안 다른 용도로 재사용되지 않도록 해야 합니다.
이는 클래스가 존재하는 확장 모듈에 “속하기” 때문에 다른 확장과 충돌하지 않습니다.
:c:func:`PyType_GetBaseByToken`을 사용하여 클래스의 슈퍼 클래스가 주어진 토큰을 가지고 있는지 확인하십시오. 즉, 메모리 레이아웃이 호환되는지 확인하는 것입니다.
주어진 클래스에 대한 토큰(슈퍼 클래스를 고려하지 않음)을 얻으려면
Py_tp_token과 함께PyType_GetSlot()을 사용하십시오.Added in version 3.14.
-
Py_tp_slots¶
- 상의 안정 ABI 버전 3.15 이후로.
Slot IDthat works likePy_slot_subslots, except it specifies an array ofPyType_Slotstructures.Added in version 3.15.
‘일반적으로 폐지된 API (Soft-deprecated)’¶
다음 함수들은 soft deprecated`(약하게 폐지됨)입니다. 계속 작동하겠지만, 새로운 기능은 새 ``PyType_From*` 함수의 인수가 아닌, PyType_FromSlots()\에 슬롯으로 추가될 것입니다.
-
PyObject *PyType_FromMetaclass(PyTypeObject *metaclass, PyObject *module, PyType_Spec *spec, PyObject *bases)¶
- 상의 안정 ABI 버전 3.12 이후로.
spec으로 힙 형을 만들고 반환합니다 (
Py_TPFLAGS_HEAPTYPE을 찹고하세요).비``NULL`` metaclass 인자는
Py_tp_metaclass\ 슬롯에 해당합니다.비``NULL`` bases 인자는
Py_tp_bases\ 슬롯에 해당하며,Py_tp_bases및Py_tp_bases\ 슬롯보다 우선합니다.비``NULL`` module 인자는
Py_tp_module\ 슬롯에 해당합니다.이 함수는 새로운 형에
PyType_Ready()를 호출합니다.이 함수는
type() <type>`을 호출하거나 :keyword:`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에서 변경: (이제) 함수는 제공된 기본 클래스에 해당하는 metaclass를 찾아 사용합니다. 이전에는
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에서 변경: (이제) 함수는 제공된 기본 클래스에 해당하는 metaclass를 찾아 사용합니다. 이전에는
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] 슬롯에 제공된 기본 클래스에 해당하는 metaclass를 찾아 사용합니다. 이전에는
type\ 인스턴스만 반환되었습니다.메타클래스의
tp_new는 무시 됩니다. 이로 인해 초기화가 불완전할 수 있습니다. 메타클래스가tp_new\를 오버라이드하는 클래스를 만드는 것은 사용이 중단되고 있습니다.버전 3.14에서 변경: 메타클래스가
tp_new\를 오버라이드하는 클래스를 생성하는 것은 더 이상 허용되지 않습니다.버전 3.16.0a0 (unreleased)부터 약하게 폐지 <Soft deprecated>: 새 코드에서는
PyType_FromSlots()\를 선호하는 것이 좋습니다.
-
type PyType_Spec¶
- 상의 안정 ABI (모든 멤버 포함).
타입의 동작을 정의하는 구조체이며,
PyType_FromMetaclass()\와 같은 soft-deprecated 함수에 사용됩니다.이 구조체에는 대신
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 (모든 멤버 포함).
Structure defining optional functionality of a type, used for soft-deprecated functions like
PyType_FromMetaclass().PyType_Slot배열에는 :c:macro:`Py_tp_slots`를 사용하여 :c:type:!PySlot` 배열에, 그리고 그 반대로 `:c:macro:`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입니다.
-
type PyType_Slot¶
-
const char *name¶