我正在编写Queue.Queue的自定义子类,并遇到一种情况,当我的自定义put()被调用时,我需要获取队列级锁。我想重用Queue已有的锁(Queue.mutex),但是不能,因为它不是RLock

在源代码(python 2.6)中,它说:

# Override these methods [_put, _get, etc] to implement other queue organizations
# (e.g. stack or priority queue).
# These will only be called with appropriate locks held

但是在线文档中没有提及覆盖它们。该模块中的其他Queue实现将覆盖这些实现。因此,我有点相信_put方法是程序包私有(private)的,并不是真的打算在Queue模块之外使用。

有谁知道在我自己的子类中使用Queue._put和 friend 会怎样?

最佳答案

就我而言,这完全是犹太洁食。在Python中,the source is the documentation或至少应被视为已发布的API文档的补充。这很大程度上是由于强制使用了emphasize clear, readable code的空白和编码约定而导致的:当您对文档没有回答的问题有疑问时,您应该可以使用源代码并查找答案。

尤其是,像这样的细节与Queue模块的大多数客户端(他们只是使用类)无关,因此他们不会将其纳入已发布的文档中。但是,如果您想继承Queue,则开发人员希望您能进行更深入的研究,因此该注释可在源代码中找到,以供您查找。

我还将提到Python并没有“包私有(private)”的概念。从语义上讲,在同一模块中的子类与在不同模块中的子类之间没有什么区别,即使您自己编写一个子类也是如此。实际上,Python甚至没有“私有(private)”的概念。相反,它依赖于负责任使用的原则:作为开发人员,您应该足够聪明,不要在不需要时使用内部方法。用下划线开头的成员名称只是一个线索,它是一个内部方法,如果您仅使用类,则可能不应该访问它-但是,如果您将其子类化,则任何事情都是公平的。

10-05 21:05
查看更多