我最近在stackoverflow上发布了a question,我得到了一个解决方案。
有人向我建议编码风格,我还没有收到进一步的意见。我参考先前的查询有以下问题。
如何在python中的类中声明私有变量?我认为通过使用双下划线(__),变量被视为私有。请纠正我。
根据之前收到的建议,我们不必使用getter或setter方法。我们不应该使用吸气剂或二传剂或两者兼而有之吗?请让我知道你对此的建议。
答案 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的非公共部分(无论是函数,方法还是数据成员) 。它应被视为实施细节,如有更改,恕不另行通知。
(继续阅读有关类私有变量和名称修改的更多详细信息)