我在Python的线程模块源代码中注意到了这一点:
def Event(*args, **kwargs):
return _Event(*args, **kwargs)
class _Event(_Verbose):
...
我认为这是在尝试模仿其他语言的“密封”类(c#)或“最终”类(java)时,我是否正确?这是Python中的常见模式吗?在Python中有没有其他方法解决这个问题?
答案 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中的常见模式。我们特别不鼓励继承的东西很少。