加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Python > 正文

无法在python中模拟__subclasses__

发布时间:2020-12-20 13:49:51 所属栏目:Python 来源:网络整理
导读:为什么以下代码不起作用? from mock import * class A(object):... pass... mock = create_autospec(A) mock.foo = Mock() # this works mock.__bar__ = Mock() # this works too mock.__subclasses__ = Mock() # this failsAttributeError: Mock object ha
为什么以下代码不起作用?

>>> from mock import *
>>> class A(object):
...     pass
...
>>> mock = create_autospec(A)
>>> mock.foo = Mock()                # this works
>>> mock.__bar__ = Mock()            # this works too
>>> mock.__subclasses__ = Mock()     # this fails
AttributeError: Mock object has no attribute '__subclasses__'

我想我在这里遵循关于嘲笑魔法的文档.文档确实说过,试图模仿一个不在规范中的魔术方法是行不通的.但是为什么__subclasses__不符合自动指定的新式类的规范?

解决方法

__subclasses__不是类规范的一部分.它是类的元类型的一部分(在此处键入).

Python总是looks up special methods on the type,永远不会直接.如果Python需要调用__subclasses__,它不会直接调用它,它将使用type(classobj).__ subclasses __(classobj)来查找未绑定的方法并手动传入第一个参数.因此,将__subclasses__添加到类的模拟中是不够的.

这同样适用于旨在对实例进行操作的特殊方法;当使用create_autospec()时,Mock会愉快地使用__add__或__str__,然后对于模拟类的实例,Python将使用类型(mockinstance).__ str __(mockinstance)来调用__str__方法.

如果你自己的代码直接调用classobj .__ subclasses __(),你需要传入一个显式设置该方法的类mock;你不能指望它在这里自动指定.

模仿不喜欢你设置任何有效的魔术方法:

>>> m = create_autospec(A)
>>> m.__add__ = Mock()
Traceback (most recent call last):
  File "<stdin>",line 1,in <module>
  File "/Users/mj/Development/venvs/stackoverflow-2.7/lib/python2.7/site-packages/mock.py",line 767,in __setattr__
    raise AttributeError("Mock object has no attribute '%s'" % name)
AttributeError: Mock object has no attribute '__add__'

只允许使用非默认魔术方法:

>>> m.__dummy__ = Mock()
>>> m.__dummy__
<Mock name='mock.__dummy__' id='4427608656'>

您可以在__subclass__方法中创建A的子类,以允许您模拟它:

>>> class AMockSpec(A):
...     def __subclasses__(self): pass
...
>>> m = create_autospec(AMockSpec)
>>> m.__subclasses__ = Mock()
>>> m.__subclasses__.return_value = ['SomeMockValue']
>>> m.__subclasses__()
['SomeMockValue']

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读