如何在Python中创建一个包保护的构造函数?

3
我想在Python中创建一个工厂模式,其中一个类有一些配置,并且知道如何按需构建另一个类的对象(或多个类)。为了使这完整,我想防止在工厂之外创建该类。在Java中,我会将两者放在同一个包中,并将类的构造函数设置为包保护.

对于常规方法名称或变量,可以遵循Python惯例并使用单下划线或双下划线("_foo"或"__foo")。是否有一种方式可以对构造函数进行类似的操作呢?
谢谢
4个回答

3

你做不到。Python 的理念通常被总结为“我们都是成年人了”,也就是说,你不能阻止人们调用方法、改变属性、实例化类等操作。相反,你应该提供一种明显的方式来构造类的实例,然后假设它会被使用。


2

别费事了,这不是Python的方式。

更好的解决方案是简单地记录客户端应该调用哪个构造函数或工厂方法,并不要过多关注公共/私有(在Python中并没有太大意义;一切本质上都是公开的)。


2
Python的约定是在内部成员或类的名称前缀加下划线。虽然没有强制限制访问权限,但下划线作为一个信号告诉开发者“你不应该触碰它”。从python教程中可以看到:
“私有”的实例变量在Python中不存在,除非这个变量只能从对象内部访问。然而,大多数Python代码都遵循以下约定:以下划线为前缀的名称(例如 _spam)应被视为API的非公共部分(无论是函数、方法还是数据成员)。这应该被视为实现细节,可能会在不提前通知的情况下进行更改。

1
__double_underscore名称实际上是被编码的,这不会强制执行任何安全性,但会引起问题。 - Katriel
2
这个不能在构造函数中使用,对吧? - oneself
1
@oneself:你可以使用类名调用构造函数,而且类名中可以加下划线。 - Wim Coenen

1
根据Wim的评论,可以使用单下划线或双下划线命名要创建的对象的类。这样就清楚了构造函数是私有的,不应直接调用。

不确定为什么这个评分是零 - 这似乎是一种很好的、Pythonic的方法来创建一个可以继承但不应该被实例化的类。也许我会改变这个答案,说“这样就清楚地表明构造函数是受保护的,只能由派生类调用”。 - ACK_stoverflow

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接