gpt4 book ai didi

python - 无法在 python 中模拟 __subclasses__

转载 作者:太空宇宙 更新时间:2023-11-03 11:49:55 26 4
gpt4 key购买 nike

为什么下面的代码不起作用?

>>> 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__'

认为我正在关注这里关于模拟魔术方法的文档。文档 do 指出,尝试模拟不在规范中的魔术方法将不起作用。但是为什么 __subclasses__ 在自动指定的新样式类的规范中?

最佳答案

__subclasses__ 不是类规范的一部分。它是类的元类型的一部分(此处为type)。

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

这同样适用于旨在对实例进行操作的特殊方法;当使用 create_autospec() 时,Mock 会很高兴地使用 __add____str__,这对 是有效的模拟类的实例,其中 Python 将使用 type(mockinstance).__str__(mockinstance) 调用 __str__ 方法。

如果您自己的代码直接调用classobj.__subclasses__(),您需要传入一个显式设置该方法的模拟类;您不能指望它会在此处自动指定。

模拟不喜欢你设置任何有效魔法方法:

>>> 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'>

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

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

关于python - 无法在 python 中模拟 __subclasses__,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30268916/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com