Python线程模块中的类为什么暴露工厂函数而不是构造函数?

10
threading模块中,像RLockSemaphoreEvent这样的名称都是工厂函数,而实现类的名称则以下划线为前缀。
这些工厂函数只是将它们收到的所有参数传递给底层构造函数。
那么这样做有什么好处呢?

2
我的猜测是这个模块是遗留的,因为它相当老了。 - Martijn Pieters
@MartijnPieters 是这样吗?我仍在我的机器上使用Python2.7。 - satoru
“threading” 在1998年被加入到Python库中;我认为Python 1.5.1版本是第一个包含它的版本。 - Martijn Pieters
@MartijnPieters 哇,那真的很老了,我当时甚至不知道Python... - satoru
Semaphore和Event是Python 3中的类。RLock函数在运行时在纯Python和C实现之间进行调度(不清楚为什么它不在导入时执行此操作(在这种情况下,所有三个名称都将引用类))。 - jfs
2个回答

4
线程SIG档案似乎已经从互联网上消失了(*), 但我很确定它是为了防止你继承那些不打算被继承的东西(你真的不想意外破坏同步原语), 而且该模块足够旧,以至于当它被添加时你不能使用新式类技巧来做到这一点。同时请注意,例如RLock有多个实现类。
*) 好吧,我在希腊的一个FTP服务器上找到了一些残留物,但那里没有原始规格说明。

Python(及其库)从何时开始试图防止人们做奇怪的事情? - glglgl
从一开始就是这样吗?毕竟这是软件,所以“防止”意味着“让它更难”,而不是“使其不可能”。一个明显的方法是...等。 - Fredrik
好的,但这在Python中是通常的行为。例如,没有私有或受保护的类属性,因为“成熟”的程序员不需要它们。(至少他们这样说。)那么防止从RLock继承就是不合逻辑和不一致的。你的看法可能会有所不同。 - glglgl

2

没有真正的优势。

Guido在1998年添加了该模块;第一个修订版已经包括了这些工厂函数。也许他对这些工厂函数有计划,也许他正在查看Java实现并复制一些惯用语,也许他想通过在他的头脑中重新实现C来使事情可插拔。

我们只能猜测,或直接问Guido。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接