python-3.x - 为什么模拟的类型与模拟不匹配?

标签 python-3.x types mocking identity

我的代码:

from datetime import datetime
from unittest.mock import Mock

a = datetime.now()
print(id(type(a)))
print(id(datetime))

b = Mock()
print(id(Mock))
print(id(type(b)))

输出:

$ python3 foo.py
4477748792
4477748792
140351771879768
140351771828664

为什么 type(a)datetime 一样?但是 type(b)Mock 不是吗?

最佳答案

如果你看到它有模拟类

class Mock(CallableMixin, NonCallableMock):

现在,如果您探索 NonCallableMock

class NonCallableMock(Base):
    """A non-callable version of `Mock`"""

    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

它清楚地提到在运行时使用新类创建一个新实例,因此一个 Mock 不会干扰其他。这就是您看到 id 不同的原因,因为对象的实际类是在运行时生成的

关于python-3.x - 为什么模拟的类型与模拟不匹配?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57512855/

相关文章:

python - 如果匹配元组的整个项目,我该如何制作

python - 使用 python 3 的中间值

java - 获取基本类型数组的 Java 大小

c++ - 使用 sizeof 获得两个的最大幂

遗留代码的 Java 重构策略

ruby - 未定义方法 `double'

python - Win32Com 在 Python 3.6 中另存为变量名

python - 如何实时更新 NetworkX 图?

vector - 我应该如何存储要从中删除但从不添加的项目列表?

python - 如何验证 python 中没有调用模拟方法?