PyObject
(файл object.h), в которой одно из полей — ob_type
, указатель на структуру _typeobject
, котоая определяет «настоящий» тип объекта. type(x)
и дескриптор object.__class__
обращаются за типом к этому полю. Но __class__
можно переопределить, что и делает weakref.proxy
. При этом type(x)
все равно будет продолжать обращаться к ob_type
и результат его определения подменить не удастся. from contextlib import nested
with nested(mock.patch(...), mock.patch(...), ...):
...
тутwith mock.patch(...), mock.patch(...), ...:
...
from parent import _mysql
. Можно также просто повторно импортировать _mysql
, это вернет уже импортированный модуль из sys.modules
. В Python у каждого модуля свое пространство имен, модули между собой никак не пересекаются, и это считается feature, а не bug. Импортировать _mysql
даже правильнее, если родительский модуль ничего к нему не добавляет — это явно дает понять, что мы имеем дело с общим _mysql
, а не с тем, что в родительском модуле называется _mysql
.