在 Python 中不使用私有方法和函数是不好的做法吗?

Tom*_*ker 4 python oop encapsulation private

背景

\n

几周前,我完成了 Python 的技术测试。虽然测试的总体反馈非常积极,但我在反馈中看到的令我惊讶的一件事是:

\n
\n

没有封装 \xe2\x80\x93 大量的 public_functions 应该是 _private_functions

\n
\n

这让我感到惊讶,因为根据我作为 Python 开发人员两年来在脑海中建立的模糊画面,我们实际上并没有在 Python 中执行私有方法或函数。我们所拥有的只是惯例、速记和君子协定的拼凑而成。但我脑海中的那个画面是正确的吗?

\n

下划线和双下划线

\n

因此,我更深入地研究了这个问题,查阅了标准 Python 文档以及PEP 8,并得出了以下结论:

\n
    \n
  1. 在类属性之前使用双下划线会调用名称修改,即将__spam被解释为_classname__spam. 这可以用来模拟一种粗略的隐私,这样如果有人尝试__spam从类之外调用,就会引发异常。
  2. \n
  3. 程序员可以使用单个下划线来指示函数(或类似函数)是私有的,但这似乎没有什么语法效果。PEP 8 提到调用_single_leading_underscore时不会导入from M import *,但我找不到其他任何内容。
  4. \n
\n

然而,这只是告诉我我可以做什么,而不是我该做什么。

\n

我想知道什么

\n

我是否可以将上述反馈视为来自可能将其职业生涯花在 Java/C#/etc 编程上的人,因此在使用 Python 进行封装时没有正确的心态?或者我应该重新思考编写 Python 程序的方式,以便任何封装都更加明确?

\n

jur*_*rez 6

从技术角度来看,编写代码的方式没有正确或错误之分。计算机关心的是指令和数据。无论你是否使用类,如果你的代码是模块化的还是意大利面条式的,你的函数的名称是什么,它们是公共的还是私有的等等——当它到达 CPU 时,一切都会付诸东流。

像这样的争论是关于观点的争论。每个人都有意见。你也可以称之为味道。具有相似观点的人们聚集在一起,创建组织、政党、机构等来宣传他们的想法。他们声称,以某种方式可以概括和提炼软件的编写方式,从而得出“正确”或“错误”的决策。

然而,对于每一条证明某事的规则,你很快就会发现另一个与之相矛盾的规则。这就是自然法则——现实无国界。这就是一切混乱的原因。

对于某件事,不存在、也永远不会存在普遍规则。这将与宇宙的本质相矛盾:时间和熵。无论你问什么问题,答案总是“视情况而定”。

经过 40 年的编程生涯,我的核心价值观如下:

  • 一致性比风格更重要。
  • 让读者很容易理解你在做什么,更重要的是,为什么这样做。
  • 在正确的地方发表一条好的评论可以避免一周的头痛。
  • 读者可能就是你。
  • 始终尝试选择最适合工作的工具。
  • 在有意义的地方遵循惯例,但当你有正当理由时,请毫不犹豫地打破规则。
  • 没有人比编写代码的人更清楚什么是有意义的。不断问自己:我正在做的事情有意义吗?或者我是否找到了更好的方法?
  • 少即是多。