繁体   English   中英

Python:什么是 function 调用模拟 object?

[英]Python: what's a function call on a mock object?

我不小心偶然发现了这种符号:

>>> m = mock.Mock()
>>> m().my_value = 5
>>> 
>>> m
<Mock id='139823798337360'>
>>> m()
<Mock name='mock()' id='139823798364240'>

m是模拟类型的 object, ()是 function 调用。 function 如何调用 object?

我尝试调用普通的 object,但预计我遇到了异常

>>> class C(object):
...     pass
... 
>>> c = C()
>>> c()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: 'C' object is not callable

所以这一定是某种模拟魔法。 它是什么,它是用来做什么的?

在 Python 中,任何 object 都是可调用的,如果它实现了__call__方法。

任何 function 都可以调用,因为 function object 实现了__call__ 此外,所有类都是可调用的。 所以你可以创建一个 class 的实例

在您的 class 中,如果您添加__call__它会如下所示

class C(object):
    def __call__(self, *args):
        print("instance is called with %s", tuple(args))

Mock class 定义__call__以便您可以跟踪模拟 object 的调用。

>>> m = Mock()
>>> m(3, 4)
<Mock name='mock()' id='140219558391696'>
>>> m.mock_calls
[call(3, 4)]
>>> 

我会回答这个问题,因为我的问题似乎不太清楚。 所以符号:

m = mock.Mock()
m().my_value = 5

用于模拟工厂函数。 当您需要模拟返回具有某些属性的 object 的 function 时。 每次调用m()都会返回模拟 object ,它与m本身不同,但每次都相同(通常每次调用工厂 function 都会返回一个新对象)。 因此,当设置此 object 的属性时(如m().my_value=5 ),它将在以后对m()的任何调用中可用

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM