【问题标题】:Private functions / Variables enforcement in pythonpython中的私有函数/变量强制执行
【发布时间】:2011-04-05 22:18:51
【问题描述】:

我看到很多“松散”私有变量/函数的 Python 代码。他们将用一个下划线(例如_foo)声明函数/变量,然后仅在类/文件中使用它。他们不使用双下划线真的让我很恼火,因为最终,有人会从课堂外称这个“私人”成员。

有没有什么方法可以对单下划线强制保密(不改为双下划线)? 谢谢!

【问题讨论】:

  • __ 具有特殊意义。它破坏了名称,使调试变得困难,并且可能导致自省的有趣问题。您的“松散”隐私确实是有意义的。这个会违反 Python 基本规则的神秘“人”是谁?当单元测试因为违反规则而失败时,还需要什么?他们违反了 API 并且测试失败了。这还不够吗?
  • 不,即使是双下划线实际上也不能强制执行 private: docs.python.org/tutorial/classes.html#tut-private
  • 想象一下,如果您看不到某个对象的某些状态,就尝试调试它。 :-)

标签: python


【解决方案1】:

没有。这就是 python 的哲学:不要让编译器/解析器强制隐私,因为想要访问私有成员的开发人员无论如何都有办法这样做(反射等)。 这个想法告诉人们嘿,这不是公共 API 的一部分。如果您使用不当,它可能会破坏物品或杀死您的猫。我也可能经常更改签名,因为它不是公共 API 的一部分,而且我不必关心使用它的人

仅供参考,您实际上可以使用obj._ClassName__variableName 从外部访问双下划线变量(同样适用于方法)。除此之外,不鼓励使用双下划线,除了 mixin 对象——你永远无法知道是否有人想继承你的类。

【讨论】:

    【解决方案2】:

    在 Python 中,没有严格的私有方法概念(例如 Java)。即使使用双下划线仍然可以通过 _classname__method 访问。

    简而言之,不要违背规律,而要遵循 Python 哲学,在该哲学中,私有是一种约定,而不是一种力量。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-03-29
      • 2015-02-16
      • 1970-01-01
      • 1970-01-01
      • 2018-07-05
      • 2015-09-21
      • 1970-01-01
      • 2013-08-02
      相关资源
      最近更新 更多