无法在python中模拟__subclasses__
为什么以下代码不起作用?
>>> 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'] (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |