首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Python:在模拟对象上的函数调用是什么?

Python:在模拟对象上的函数调用是什么?
EN

Stack Overflow用户
提问于 2020-05-20 20:26:44
回答 2查看 46关注 0票数 0

我偶然发现了这种符号:

代码语言:javascript
运行
复制
>>> m = mock.Mock()
>>> m().my_value = 5
>>> 
>>> m
<Mock id='139823798337360'>
>>> m()
<Mock name='mock()' id='139823798364240'>

m是一个模拟类型的对象,()是一个函数调用。你如何函数调用一个对象?

我尝试调用一个普通的对象,意外地得到了一个异常

代码语言:javascript
运行
复制
>>> class C(object):
...     pass
... 
>>> c = C()
>>> c()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: 'C' object is not callable

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

EN

回答 2

Stack Overflow用户

发布于 2020-05-20 20:32:11

在Python语言中,任何实现__call__方法的对象都是可调用的。

当function对象实现__call__时,任何函数都是可调用的。而且,所有的类都是可调用的。所以你可以创建一个类的实例

在您的类中,如果添加__call__,它将如下所示

代码语言:javascript
运行
复制
class C(object):
    def __call__(self, *args):
        print("instance is called with %s", tuple(args))

Mock类定义了__call__,因此您可以跟踪对模拟对象的调用。

代码语言:javascript
运行
复制
>>> m = Mock()
>>> m(3, 4)
<Mock name='mock()' id='140219558391696'>
>>> m.mock_calls
[call(3, 4)]
>>> 
票数 1
EN

Stack Overflow用户

发布于 2020-05-25 23:32:21

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

代码语言:javascript
运行
复制
m = mock.Mock()
m().my_value = 5

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61913125

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档