gpt4 book ai didi

python-3.x - 为什么 type(mock.MagicMock()) == mock.MagicMock 返回 False?

转载 作者:行者123 更新时间:2023-12-01 23:51:25 25 4
gpt4 key购买 nike

在 Python3.4 中:

>>> import mock.MagicMock
>>> type(mock.MagicMock()) == mock.MagicMock
False # Huh, why is that?
>>> isinstance(mock.MagicMock(), mock.MagicMock)
True

当我将其简化为类时 ABtype(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 ?我知道 difference between isinstance() and type() 在 Python 中。 type()不“理解”子类化在哪里 isinstance做。但我不明白这里是如何涉及这种差异的。

sourcemock.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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com