我在Python的线程模块源代码中注意到了这一点:
def Event(*args, **kwargs):
return _Event(*args, **kwargs)
class _Event(_Verbose):
...
Run Code Online (Sandbox Code Playgroud)
我是否正确地假设这是在其他语言中模仿"密封"类(c#)或"最终"类(java)的尝试?这是Python中的常见模式吗?在Python中有没有其他方法解决这个问题?
我不认为我喜欢这种标识符的选择.通常用大写字母来启动类名,所以你认为你可以说isinstance(x, Event)
,但你不能.我认为这样的名称make_event
明确地将函数标识为函数会更好.
这开始是一个API设计实验,我试图让事情看起来像尽可能类似的Java API(我不想发明另一个摇摆不定的轮子).我特别希望这些不是类,以便人们不会开始子类化它们.当时PEP-8还没有完善(如果有的话),我希望工厂的功能看起来像是类.我认为在2.7/3.1中我们可以将工厂功能更改为符合PEP-8(将旧名称保留为几个版本).
他提到的改变尚未完成,但我认为现在命名方案被误导并且不应该扩散,这是非常安全的.
当你说引入这些工厂功能来模仿密封的类时,你是对的.BDFL 说
允许它们被子类化使得在某些平台上用相同但更快的实现更换它们变得更加困难.
我不认为这个方案太常见了.大多数情况下,没有动机用等效实现替换类,如果类不是为子类设计的,你可以在文档中提到它.