Python约定:私有类的函数构造函数

时间:2011-01-21 18:26:16

标签: python design-patterns

我在Python的线程模块源代码中注意到了这一点:

def Event(*args, **kwargs):
  return _Event(*args, **kwargs)

class _Event(_Verbose):
  ...

我认为这是在尝试模仿其他语言的“密封”类(c#)或“最终”类(java)时,我是否正确?这是Python中的常见模式吗?在Python中有没有其他方法解决这个问题?

2 个答案:

答案 0 :(得分:5)

我认为我不喜欢这种标识符的选择。通常用大写字母来启动类名,所以你认为你可以说isinstance(x, Event),但你不能。我认为像make_event这样明确地将函数标识为函数的名称会更好。

此问题已在邮件列表中discussed,其中BDFL states

  

这最初是在API中进行的一项实验   设计,我试图让事情看起来像类似的东西   Java API尽可能(我不想再发明另一个   轮)。我特别希望这些成为人们的课程   不会开始继承它们。当时PEP-8不太好   建立(如果有的话)我希望工厂功能看起来   喜欢上课。我认为在2.7 / 3.1中我们可以改变工厂功能   符合PEP-8(留下旧名称的几个   释放)。

他提到的改变还没有完成,但我认为现在命名方案被误导,不应该扩散,这是非常安全的。

当你说引入这些工厂功能来模仿密封类时,你是对的。 BDFL says

  

允许它们被子类化使得在某些上更换它们变得更加困难   具有相同但更快实现的平台。

我不认为这个方案太常见了。大多数情况下,没有动机用等效实现替换类,如果类不是为子类设计的,你可以在文档中提到。

答案 1 :(得分:1)

这似乎就是这个想法,但显然,如果你愿意,仍然完全有可能从类继承(即使它们在一个单独的模块中,你可以type(Event())来获取参考。只是为了让人们在对它们进行子类化之前进行思考。

这不是Python中的常见模式。我们特别不鼓励继承的东西很少。