python - 在 Python 中编写一个无操作或虚拟类

标签 python

假设我有这样的代码:

foo = fooFactory.create()

由于各种原因,fooFactory.create() 可能无法创建 Foo 的实例。

如果是这样,我希望 fooFactory.create() 返回一个虚拟/无操作对象。这个对象应该是完全惰性的——无论它如何被使用,它都不应该做任何事情或抛出任何异常。请注意,foo 没有返回值的方法。


我考虑了以下选项。

首先,创建一个模拟。这样做的好处是它很容易,而且能给我我想要的东西。缺点是在生产代码中使用模拟感觉很奇怪。更重要的是,我无法控制模拟库,因此它的行为可能会在某个时刻发生变化并破坏我的应用程序。

其次,创建一个dummy NoopFoo/DummyFoo 类。然后我手动实现它需要支持的方法,把pass放在方法体里就行了。我知道它的好处永远不会破坏我的应用程序。缺点是,如果将来使用 Foo 的其他方法,我必须知道更新 NoopFoo/DummyFoo ... 或我的应用程序可能会坏。

还有比这两个更好的选择吗?请注意,我是 Python 的新手,所以如果它涉及更高级的 Python 功能,我将不胜感激。谢谢!

最佳答案

您要求一个什么都不做的对象。 object 的实例正是这样做的。

def create():
    return object()

另一方面,您可能真的希望它做一些事情。您可能希望它具有执行并返回 None 的方法。您可能会返回此类的一个实例:

In [1]: class Nop(object):
   ...:     def nop(*args, **kw): pass
   ...:     def __getattr__(self, _): return self.nop
   ...:     

In [2]: n=Nop()

In [3]: n.foo
Out[3]: <bound method Nop.nop of <__main__.Nop object at 0x7f9fec034650>>

In [4]: n.foo()

In [5]: n.foo(1,2,3)

关于python - 在 Python 中编写一个无操作或虚拟类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24946321/

相关文章:

python - 如何将python+pygame程序打包为可执行文件?

python - 导入错误 : No module named '_pywrap_tensorflow_internal'

python - 使用来自其他 Series/DataFrame 的值(曲线下面积)过滤 DataFrame 中的每个 X

python - 使用 PIL 复制三角形图像区域

python - 运行 keras-text-summarization 时没有名为 'keras_text_summarization' 的模块

python - 如何制作 django 模型 "commentable", "likeable"和 "rateable"

python - 你如何研究 python 的内置方法的实现?

python - codecs.open(utf-8) 无法读取纯 ASCII 文件

python - 有没有办法将数据框设为 "unstack"并作为列表值返回

python - 如何使快捷方式从 PATH 工作