在 Python3.4 中:
>>> import mock.MagicMock
>>> type(mock.MagicMock()) == mock.MagicMock
False # Huh, why is that?
>>> isinstance(mock.MagicMock(), mock.MagicMock)
True
当我将其简化为类
A
和 B
时,我 type(B()) == B
返回 True
:>>> class A: pass
>>> class B: pass
>>> class C(A, B): pass
>>> type(B()) == B
True # Of course I would say.
为什么返回
type(mock.MagicMock()) == mock.MagicMock
False
?我知道 Python 中的 difference between isinstance()
and type()
。 type()
不“理解” isinstance
的子类化。但我不明白这里是如何涉及这种差异的。source 的
mock.MagicMock
。 最佳答案
更多的实验给出了答案。
>>> from unittest.mock import MagicMock as mm
>>> mm1 = mm()
>>> mm2 = mm()
>>> type(mm1)
<class 'unittest.mock.MagicMock'>
>>> type(mm2)
<class 'unittest.mock.MagicMock'>
>>> type(mm1) == type(mm2)
False
>>> id(type(mm1))
53511896
>>> id(type(mm2))
53510984
>>> type(mm1) is mm1.__class__
True
>>> mm
<class 'unittest.mock.MagicMock'>
>>> id(mm)
53502776
结论:MagicMock 的每个实例都有一个看起来像 MagicMock 的“类”,但实际上不是。创建此类实例的 新 是什么? MagicMock 是 Mock 的子类,Mock 是 NonCallableMock 的子类,它具有这个 新的 方法。
def __new__(cls, *args, **kw):
# every instance has its own class
# so we can create magic methods on the
# class without stomping on other mocks
new = type(cls.__name__, (cls,), {'__doc__': cls.__doc__})
instance = object.__new__(new)
return instance
new = ...
语句创建具有相同名称和文档字符串的 cls
参数的子类。下一行创建此子类的单个实例。所以 Mocks 遵循修改后的相等而不是 type(mm()) is mm
。>>> mm.__bases__
(<class 'unittest.mock.MagicMixin'>, <class 'unittest.mock.Mock'>)
>>> type(mm1).__bases__
(<class 'unittest.mock.MagicMock'>,)
>>> type(mm1).__bases__[0] is mm
True
关于python-3.x - 为什么 type(mock.MagicMock()) == mock.MagicMock 返回 False?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/26319942/