什么是使用私有变量的Pythonic方法?

tec*_*her 6 python

我最近发布了一个关于stackoverflow 的问题,我得到了一个解决方案.

有人向我建议编码风格,我没有收到进一步的意见.我参考先前的查询有以下问题.

  1. 我们如何在python中的类中声明私有变量?我认为通过使用双下划线(__),变量被视为私有.请指正.

  2. 根据之前收到的建议,我们不必使用getter或setter方法.我们不应该使用吸气剂或二传剂或两者兼而有之吗?请让我知道你对此的建议.

小智 9

一切都public在Python中,按照__惯例建议您不应该使用该函数,因为它是一个实现细节.

这不是由语言或运行时以任何方式强制执行的,这些名称以半混淆的方式进行修饰,但public对于尝试使用它们的所有代码,它们仍然可见.

惯用Python不使用get/set访问器,因为没有private范围,所以重复工作.

当您希望间接访问成员变量以使其具有代码时,您只使用访问器,然后将成员变量标记__为其名称的开头并提供具有实际名称的函数.

您可以通过编写大量代码来尝试使用描述符和元编程来保护用户自己,但最终您将获得更多代码,更多的是测试和更多维护,但仍然无法保证不好的事情不会发生.不要担心 - 到目前为止,Python已经以这种方式存活了20年,所以它不是那么大的交易.

  • `__` 不仅仅是一个约定。单下划线是但双下划线添加了属性名称修改。当在 `class` 块中使用时,每个这样的属性 (`__foo`) 都会被转换为 `_ClassName__foo`。大量使用此功能很快就会使代码难以阅读且令人困惑。大多数时候,单个下划线足以作为提示。 (2认同)

Ada*_*ner 6

PEP 8 ( http://www.python.org/dev/peps/pep-0008/ ) 有一个“继承设计”部分,应该可以解决大多数这些问题。

去引用:

“我们在这里不使用术语“私有”,因为在 Python 中没有属性是真正私有的(通常不需要做不必要的工作)。”

还:

“如果您的类打算进行子类化,并且您有不希望子类使用的属性,请考虑使用双前导下划线命名它们,并且不使用尾随下划线。”

如果您还没有阅读整个部分,我鼓励您阅读全文。

更新:

回答这个问题(现在标题已更改)。使用私有变量的 Pythonic 方法是不使用私有变量。试图在 python 中隐藏某些东西很少被视为 pythonic。