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

时间:2011-10-05 01:42:39

标签: python

我最近在stackoverflow上发布了a question,我得到了一个解决方案。

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

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

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

5 个答案:

答案 0 :(得分:9)

Python中的所有内容都是public__是一种惯例建议,您不应该使用该函数,因为它是一个实现细节。

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

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

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

您可以花大量时间编写大量代码来尝试使用Descriptors和元编程来保护用户免受攻击,但最终您会得到更多代码来测试更多代码保持,但仍然没有保证不会发生坏事。不要担心 - 到目前为止,Python已经以这种方式存活了20年,所以它不可能是那么大的交易。

答案 1 :(得分:4)

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

引用:

“我们这里不使用”私人“这个词,因为没有属性       Python中的私有(没有通常不必要的工作量)。“

此外:

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

如果您没有阅读整个部分,我建议您这样做。

<强>更新

回答问题(现在标题已经改变)。使用私有变量的pythonic方法是使用私有变量。试图在python中隐藏某些内容很少被视为pythonic。

答案 2 :(得分:1)

您可以使用Python属性而不是getter和setter。只需使用实例属性,当您需要更复杂的东西时,请将此属性设为属性,而不要更改太多代码。

http://adam.gomaa.us/blog/2008/aug/11/the-python-property-builtin/

答案 3 :(得分:0)

私人变量:

如果在类成员的开头使用双下划线,则它们被认为是私有的,但不是由python强制执行的。他们只是在前面添加了一些命名,以防止它们被轻易访问。单下划线可视为“受保护”。

的getter / setter:

如果您想要执行更多操作以包装流程并“保护”您的“私有”属性,则可以使用这些。但它再次不是必需的。您还可以使用具有getter / setter功能的Properties。

答案 4 :(得分:0)

1)http://docs.python.org/tutorial/classes.html#private-variables

  

Python中不存在除对象内部之外无法访问的“私有”实例变量。但是,大多数Python代码都遵循一个约定:前缀为下划线的名称(例如_spam)应被视为API的非公共部分(无论是函数,方法还是数据成员) 。它应被视为实施细节,如有更改,恕不另行通知。

(继续阅读有关类私有变量和名称修改的更多详细信息)

2)http://docs.python.org/library/functions.html#property