Официальный документ API гласит:
Если установлен tp_finalize, интерпретатор вызывает его один раз при финализации экземпляр.
Однако это, похоже, не верно для статических типов Python, определенных в C, которые не определяют пользовательский освободитель (ни напрямую, ни унаследовано). со своей базы). Насколько я понимаю:
- Статические типы без специального tp_dealloc будут наследовать механизм освобождения от базового типа Python (), то есть object_dealloc.
Код: Выделить всё
PyBaseObject_Type
чрезвычайно прост, он просто вызывает tp_free данного типа объекта.Код: Выделить всё
object_dealloc
- Поэтому tp_finalize никогда не будет вызываться для этих объектов.< /li>
- намного сложнее и будет вызывать PyObject_CallFinalizerFromDealloc.
Код: Выделить всё
subtype_dealloc
< h2>Вопросы
Предполагая, что я правильно понимаю текущее поведение CPython:
- Ожидается ли, что PyBaseObject_Type< /code> Deallocator не вызывает tp_finalize?
- Если да, то каковы причины этого исключения?
- И поможет ли это смысл тогда предоставлять subtype_dealloc как общий обратный вызов Dealloc для статических типов, определенных в C?
Подробнее здесь: https://stackoverflow.com/questions/788 ... tom-tp-dea