在 Python 中不使用私有方法和函数是不好的做法吗?
Is it bad practice NOT to use private methods and functions in Python?
背景
几周前,我在Python完成了技术测试。虽然测试的总体反馈非常积极,但令我惊讶的是,在反馈中读到的一件事是:
No encapsulation – plenty of public_functions which should be _private_functions
这让我感到惊讶,因为 - 根据我作为 Python 开发人员两年来在脑海中建立的模糊画面 - 我们不 真的在Python中做私有方法或函数。我们所拥有的只是约定俗成的拼凑而成,shorthand 和君子协定。但我脑海中的那个画面是正确的吗?
下划线和双下划线
所以我更深入地研究了此事,咨询了 the standard Python documentation as well as PEP 8,并得出以下结论:
- 在 class 属性调用 name mangling[=45 之前使用 双下划线 =],即
__spam
将被解释为 _classname__spam
。这可以用来模拟一种粗略的隐私,这样如果有人试图从其 class 外部调用 __spam
,则会引发异常。
- 程序员可以使用单下划线来表示函数(或类似函数)是私有的,但这似乎没有什么句法 影响。 PEP 8 提到调用
from M import *
时不会导入 _single_leading_underscore
,但我找不到其他任何东西。
然而,这只是告诉我我可以做什么,而不是我应该做什么。
我想知道的
我能否取消上述反馈,因为他可能在 Java/C#/etc 中度过了他的职业生涯编程,因此在封装 [=] 时没有正确的心态57=]?或者我应该重新考虑我编写 Python 程序的方式,以便任何封装都更加明确?
总而言之,是的,听听反馈。虽然 Python 并没有真正像 C++ 或 Java 那样保护隐私,但它仍然向开发人员和用户发出信号,表明其意图是什么。 public 属性可以以任何方式设置,如果您总是期望“object.x”是一个整数并且它们将其设为字符串,这可能会导致错误。当一个属性被设为私有时(虽然不是真正私有的)意味着用户不能直接访问它,并且必须使用提供的处理程序。处理程序方法提供唯一的访问方式,并要求所有交互使用相同的通道。同样的想法也适用于方法。有一些方法 user/developer 永远不需要直接使用,为了简化封装,这些方法应该是私有的。虽然并非完全必要,但使用 Python 的隐私功能确实有助于封装并有助于防止发生不可预见的错误。
从技术的角度来看,没有正确或错误的代码编写方式。计算机关心的是指令和数据。如果您使用或不使用类,如果您的代码是模块化的或意大利面条式的,您的函数的名称是什么,如果它们是 public 或私有等 - 当它到达 [= 时,一切都会付诸东流。 40=].
诸如此类的争论都是关于观点的争论。每个人都有意见。你也可以称之为味道。具有相似观点的人聚集在一起,创建组织、政党、机构等来宣传他们的想法。他们声称可以通过某种方式概括和提炼软件的编写方式,从而做出“正确”或“错误”的决定。
然而,对于每条证明某事的规则,您很快就会发现另一条与之相矛盾的规则。这只是自然法则——现实是无国界的。这就是所有混乱的原因。
没有关于某事的普遍规则这样的东西,而且永远不会有。这将与宇宙的本质相矛盾:时间和熵。无论您问什么问题,答案总是“视情况而定”。
经过 40 年的编程,我的核心价值观归结为:
- 一致性比风格更重要。
- 让 reader 更容易理解你在做什么,更重要的是,为什么。
- 在正确的地方发表一个好的评论可以避免一周的头痛。
- reader 可能就是你。
- 始终尝试选择最适合工作的工具。
- 遵循合理的约定,但如果有正当理由,请毫不犹豫地打破规则。
- 没有人比编写代码的人更清楚什么是有意义的。不断问自己:我正在做的事情是否有意义,或者我是否找到了更好的方法?
- 少即是多。
背景
几周前,我在Python完成了技术测试。虽然测试的总体反馈非常积极,但令我惊讶的是,在反馈中读到的一件事是:
No encapsulation – plenty of public_functions which should be _private_functions
这让我感到惊讶,因为 - 根据我作为 Python 开发人员两年来在脑海中建立的模糊画面 - 我们不 真的在Python中做私有方法或函数。我们所拥有的只是约定俗成的拼凑而成,shorthand 和君子协定。但我脑海中的那个画面是正确的吗?
下划线和双下划线
所以我更深入地研究了此事,咨询了 the standard Python documentation as well as PEP 8,并得出以下结论:
- 在 class 属性调用 name mangling[=45 之前使用 双下划线 =],即
__spam
将被解释为_classname__spam
。这可以用来模拟一种粗略的隐私,这样如果有人试图从其 class 外部调用__spam
,则会引发异常。 - 程序员可以使用单下划线来表示函数(或类似函数)是私有的,但这似乎没有什么句法 影响。 PEP 8 提到调用
from M import *
时不会导入_single_leading_underscore
,但我找不到其他任何东西。
然而,这只是告诉我我可以做什么,而不是我应该做什么。
我想知道的
我能否取消上述反馈,因为他可能在 Java/C#/etc 中度过了他的职业生涯编程,因此在封装 [=] 时没有正确的心态57=]?或者我应该重新考虑我编写 Python 程序的方式,以便任何封装都更加明确?
总而言之,是的,听听反馈。虽然 Python 并没有真正像 C++ 或 Java 那样保护隐私,但它仍然向开发人员和用户发出信号,表明其意图是什么。 public 属性可以以任何方式设置,如果您总是期望“object.x”是一个整数并且它们将其设为字符串,这可能会导致错误。当一个属性被设为私有时(虽然不是真正私有的)意味着用户不能直接访问它,并且必须使用提供的处理程序。处理程序方法提供唯一的访问方式,并要求所有交互使用相同的通道。同样的想法也适用于方法。有一些方法 user/developer 永远不需要直接使用,为了简化封装,这些方法应该是私有的。虽然并非完全必要,但使用 Python 的隐私功能确实有助于封装并有助于防止发生不可预见的错误。
从技术的角度来看,没有正确或错误的代码编写方式。计算机关心的是指令和数据。如果您使用或不使用类,如果您的代码是模块化的或意大利面条式的,您的函数的名称是什么,如果它们是 public 或私有等 - 当它到达 [= 时,一切都会付诸东流。 40=].
诸如此类的争论都是关于观点的争论。每个人都有意见。你也可以称之为味道。具有相似观点的人聚集在一起,创建组织、政党、机构等来宣传他们的想法。他们声称可以通过某种方式概括和提炼软件的编写方式,从而做出“正确”或“错误”的决定。
然而,对于每条证明某事的规则,您很快就会发现另一条与之相矛盾的规则。这只是自然法则——现实是无国界的。这就是所有混乱的原因。
没有关于某事的普遍规则这样的东西,而且永远不会有。这将与宇宙的本质相矛盾:时间和熵。无论您问什么问题,答案总是“视情况而定”。
经过 40 年的编程,我的核心价值观归结为:
- 一致性比风格更重要。
- 让 reader 更容易理解你在做什么,更重要的是,为什么。
- 在正确的地方发表一个好的评论可以避免一周的头痛。
- reader 可能就是你。
- 始终尝试选择最适合工作的工具。
- 遵循合理的约定,但如果有正当理由,请毫不犹豫地打破规则。
- 没有人比编写代码的人更清楚什么是有意义的。不断问自己:我正在做的事情是否有意义,或者我是否找到了更好的方法?
- 少即是多。