Python

약한 참조 객체

파이썬은 약한 참조를 1급 객체로 지원합니다. 약한 참조를 직접 구현하는 두 가지 구체적인 객체 형이 있습니다. 첫 번째는 간단한 참조 객체이며, 두 번째는 가능한 한 원래 객체의 프락시 역할을 합니다.

int PyWeakref_Check(PyObject *ob)

ob가 참조 객체나 프락시 객체면 0이 아닌 값을 반환합니다. 이 함수는 항상 성공합니다.

int PyWeakref_CheckRef(PyObject *ob)

ob 이 참조 객체이거나 참조 타입의 서브 클래스인 경우 0이 아닌 값을 반환합니다. 이 함수는 항상 성공합니다.

int PyWeakref_CheckRefExact(PyObject *ob)

ob 이 참조 객이지만 참조 타입의 서브 클래스가 아닌 경우 0이 아닌 값을 반환합니다. 이 함수는 항상 성공합니다.

int PyWeakref_CheckProxy(PyObject *ob)

ob가 프락시 객체면 0이 아닌 값을 반환합니다. 이 함수는 항상 성공합니다.

PyObject *PyWeakref_NewRef(PyObject *ob, PyObject *callback)
반환값: 새 참조. …의 일부 안정 ABI.

ob 에 대한 약한 참조(weak reference) 객체를 반환합니다. 이 함수는 항상 새로운 참조를 반환하지만, 새 객체를 생성하는 것을 보장하지는 않습니다. 기존 참조 객체가 반환될 수 있습니다. 두 번째 매개변수 callbackob 이 가비지 컬렉션될 때 알림을 받는 콜러블(callable) 객체일 수 있으며, 단일 매개변수(약한 참조 객체 자신)를 받아야 합니다. callbackNone 또는 NULL 일 수도 있습니다. ob 가 약하게 참조 가능한 객체가 아니거나, callback 이 콜러블이나 None 또는 NULL 이 아닌 경우 TypeError 를 발생시키고 NULL 을 반환합니다.

버전 3.16.0a0 (unreleased)에서 변경: callback 이 콜러블이나 None 또는 NULL 이 아니면 TypeError 를 발생시킵니다.

더 보기

ob 가 약하게 참조 가능한지 확인하기 위해 PyType_SUPPORTS_WEAKREFS() 를 사용합니다.

PyObject *PyWeakref_NewProxy(PyObject *ob, PyObject *callback)
반환값: 새 참조. …의 일부 안정 ABI.

ob 에 대한 약한 참조 프락시(proxy) 객체를 반환합니다. 이 함수는 항상 새로운 참조를 반환하지만, 새 객체를 생성하는 것을 보장하지는 않습니다. 기존 프락시 객체가 반환될 수 있습니다. 두 번째 매개변수 callbackob 이 가비지 컬렉션될 때 알림을 받는 콜러블 객체일 수 있으며, 단일 매개변수(약한 참조 객체 자신)를 받아야 합니다. callbackNone 또는 NULL 일 수도 있습니다. ob 가 약하게 참조 가능한 객체가 아니거나, callback 이 콜러블이나 None 또는 NULL 이 아닌 경우 TypeError 를 발생시키고 NULL 을 반환합니다.

버전 3.16.0a0 (unreleased)에서 변경: callback 이 콜러블이나 None 또는 NULL 이 아니면 TypeError 를 발생시킵니다.

더 보기

ob 가 약하게 참조 가능한지 확인하기 위해 PyType_SUPPORTS_WEAKREFS() 를 사용합니다.

int PyWeakref_GetRef(PyObject *ref, PyObject **pobj)
…의 일부 안정 ABI 버전 3.13 이후로.

약한 참조 ref 로부터 참조된 객체에 대한 strong reference 를 가져와 *pobj 에 할당합니다.

  • 성공 시, *pobj 를 참조된 객체의 새로운 strong reference 로 설정하고 1을 반환합니다.

  • 참조가 소멸한 경우(dead), *pobjNULL 으로 설정하고 0을 반환합니다.

  • 오류 발생 시 예외를 발생시키고 -1을 반환합니다.

Added in version 3.13.

int PyWeakref_IsDead(PyObject *ref)

약한 참조 ref 가 소멸했는지 테스트합니다. 참조가 소멸했다면 1을, 살아있다면 0을 반환하며, ref 가 약한 참조 객체가 아니면 오류를 설정하고 -1을 반환합니다.

Added in version 3.14.

void PyObject_ClearWeakRefs(PyObject *object)
…의 일부 안정 ABI.

이 함수는 약한 참조를 정리하기 위해 tp_dealloc 핸들러에 의해 호출됩니다.

이 함수는 object 의 약한 참조들을 순회하며, 콜백이 있는 경우 해당 콜백을 실행합니다. 모든 콜백 시도가 완료되면 반환됩니다.

void PyUnstable_Object_ClearWeakRefsNoCallbacks(PyObject *object)
이것은 불안정 API. 마이너 릴리스에서 예고 없이 변경될 수 있습니다.

콜백을 호출하지 않고 object 의 약한 참조를 정리합니다.

이 함수는 파이널라이저를 가진 타입(예: __del__())의 경우 tp_dealloc 핸들러에 의해 호출됩니다. 해당 객체의 핸들러는 먼저 약한 참조를 정리하고 콜백을 호출하기 위해 PyObject_ClearWeakRefs() 를 호출하고, 그 다음 파이널라이저를 실행하며, 마지막으로 파이널라이저에 의해 생성되었을 수 있는 모든 약한 참조를 정리하기 위해 이 함수를 호출합니다.

대부분의 경우, 약한 참조를 정리할 때는 이 함수 대신 PyObject_ClearWeakRefs() 를 사용하는 것이 더 적절합니다.

Added in version 3.13.