虽然深入研究了内置unittest.mock是如何设计的,但我在mock.py的官方源代码中遇到了these lines:

class Base(object):
    _mock_return_value = DEFAULT
    _mock_side_effect = None
    def __init__(self, /, *args, **kwargs):
        pass



class NonCallableMock(Base):
    ...
    # and later in the init
    def _init__ (...):
        ...
        _safe_super(NonCallableMock, self).__init__(
            spec, wraps, name, spec_set, parent,
            _spec_state
        )

Base类除了提供公共类属性_mock_return_value_mock_side_effect之外还有什么作用,因为它只有一个空的__init__

为什么NonCallableMock必须调用_safe_super(NonCallableMock, self).__init__(),我认为这正是Base类的空__init__方法?

非常感谢您提前回答.

我试图理解代码,但看不到设计背后的基本原理.

推荐答案

它用于多重继承,unittest.mock用于像class MagicMock(MagicMixin, Mock):这样的类.

尽管名字叫super,但它并不意味着"调用超类方法".相反,它按照类型的方法解析顺序查找下一个方法实现,当涉及多个继承时,该顺序可能不是来自当前类的父类.当您不知道方法super将调用什么时,您必须更加小心地将哪些参数传递给该方法.

这个类层次 struct 中的大多数类在调用_safe_super(...).__init__(...)时将像specwraps这样的参数转发到下一个__init__实现.即使它们的祖先都不需要这些参数,sibling 实现可能仍然需要它们.如果all个类转发这些参数,那么object.__init__个最终会收到这些参数,object.__init__个会抛出异常.

某个类必须专门处理not将这些参数传递给object.__init__的工作,并且该类必须位于类层次 struct 的根,就在object本身之下.

因此,这个Base类:这个多重继承层次 struct 中的所有其他类都要继承的类,它的存在几乎完全是为了防止object.__init__抱怨.

Python相关问答推荐

Image Font生成带有条形码Code 128的条形码时出现枕头错误OSErsor:无法打开资源

如何使用stride_tricks.as_strided逆转NumPy数组

在应用循环中间保存pandas DataFrame

Odoo -无法比较使用@api.depends设置计算字段的日期

分组数据并删除重复数据

使用新的类型语法正确注释ParamSecdecorator (3.12)

Pystata:从Python并行运行stata实例

Pandas 都是(),但有一个门槛

更改键盘按钮进入'

使用@ guardlasses. guardlass和注释的Python继承

如何让这个星型模式在Python中只使用一个for循环?

无法在Docker内部运行Python的Matlab SDK模块,但本地没有问题

如何在图中标记平均点?

如何使regex代码只适用于空的目标单元格

(Python/Pandas)基于列中非缺失值的子集DataFrame

如何在一组行中找到循环?

如何使用Azure Function将xlsb转换为xlsx?

我怎么才能用拉夫分拣呢?

Stats.ttest_ind:提取df值

查找数据帧的给定列中是否存在特定值