Python约定:私有类的函数构造器
我注意到在Python的线程模块源代码中有这样的内容:
def Event(*args, **kwargs):
return _Event(*args, **kwargs)
class _Event(_Verbose):
...
我是不是可以理解为这是在模仿其他语言中的“密封”类(比如C#)或“最终”类(比如Java)?在Python中这是常见的做法吗?还有其他解决这个问题的方法吗?
2 个回答
1
这听起来像是个主意,但显然如果你想的话,还是可以从这些类中继承的(即使它们在一个单独的模块里,你也可以用 type(Event())
来获取引用)。这大概是为了让大家在继承这些类之前多想想。
在Python中,这并不是一个常见的做法。实际上,我们很少会特别不鼓励从某些类继承。
5
我觉得这个命名方式不太好。通常情况下,类的名字应该以大写字母开头,所以你可能会想用 isinstance(x, Event)
这样的方式来检查,但其实不行。我觉得像 make_event
这样的名字更好,因为它能明确表示这是一个函数。
这个问题之前在邮件列表上已经被 讨论过,当时的BDFL 表示:
这开始是一个API设计的实验,我想让它看起来尽量像Java的API(我不想再发明一个不靠谱的轮子)。我特别希望这些不是类,这样人们就不会开始去继承它们。当时PEP-8还没有被广泛接受(甚至根本没有),我希望工厂函数看起来像类。我认为在2.7和3.1版本中,我们可以把工厂函数改成符合PEP-8的样子(同时保留旧名字一段时间)。
他提到的改变还没有实施,但我觉得现在大家普遍认为这个命名方式不太合适,不应该继续使用。
你说得对,这些工厂函数是为了模仿一个封闭的类而引入的。BDFL 说过:
允许它们被继承会让在某些平台上用更快的实现替换它们变得更困难。
我觉得这种命名方式并不常见。大多数情况下,没有必要用其他实现来替换类,如果一个类不打算被继承,可以在文档中说明这一点。