Не пойму поведение type с weakref?
Ответ такой.

Внутри интерпретатора (CPython) каждый Python-объект представлен C-структурой PyObject (файл object.h), в которой одно из полей — ob_type, указатель на структуру _typeobject, котоая определяет «настоящий» тип объекта. type(x) и дескриптор object.__class__ обращаются за типом к этому полю. Но __class__ можно переопределить, что и делает weakref.proxy. При этом type(x) все равно будет продолжать обращаться к ob_type и результат его определения подменить не удастся.
почитайте вот эту книжку www.cafepy.com/article/python_types_and_objects/python_types_and_objects.html