Чтобы ответить на последний вопрос первым: Нет, type_new
используется только для «типов кучи», которые динамически определяются во время выполнения (например, с помощью оператора класса). Статически определенные типы инициализируются с использованием PyType_Ready()
.
Чтобы ответить на ваш первый вопрос: чтобы создать тип расширения с дескриптором __dict__
, вам нужно динамически распределить тип так же, как это делает интерпретатор для определения класса.
Один из способов получить примеры для этого - сделать так, как предлагает Джон, и сгенерировать несколько собственных примеров с помощью Cython.
Для CPython 2.x вы можете посмотреть на метод build_class
в исходном коде CPython (http://svn.python.org/view/python/trunk/Python/ceval.c?view=markup), чтобы получить представление о шагах, связанных с полностью общим решением.
Если вы используете Python 3, то этот вопрос может представлять интерес: Что делает встроенная в Python __build_class__?
То есть, как конкретное решение CPython 3.x, самое простое, что нужно сделать, это вызвать builtins.__build_class__
с соответствующими аргументами через C API.