在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中的type()。type()不理解isinstance所做的子类化。但我看不出这有什么区别。
来源 of mock.MagicMock.
发布于 2014-10-12 02:01:18
更多的实验给出了答案。
>>> 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子类模拟,其中子类为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 instancenew = ...语句创建具有相同名称和docstring的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
Truehttps://stackoverflow.com/questions/26319942
复制相似问题