使用私有变量的Pythonic方式是什么?
我最近在StackOverflow上发了一个问题,并得到了答案。
有人给我提了一些关于编码风格的建议,但我还没有收到更多的反馈。现在我有一些与之前问题相关的新问题。
在Python中,我们怎么在类里面声明私有变量?我以为用两个下划线(__)就可以把变量当作私有的。请纠正我。
根据之前收到的建议,我们不需要使用getter或setter方法。那我们是不是应该用getter或setter,或者两者都用呢?请告诉我你对此的看法。
5 个回答
你可以用Python的属性来代替获取器和设置器。只需使用一个实例属性,当你需要更复杂的功能时,可以把这个属性变成一个属性,而不需要修改太多代码。
http://adam.gomaa.us/blog/2008/aug/11/the-python-property-builtin/
PEP 8(http://www.python.org/dev/peps/pep-0008/)里有一部分讲的是“为继承设计”,这部分内容可以解决大部分相关的问题。
引用一下里面的话:
“我们这里不使用‘私有’这个词,因为在Python中,没有哪个属性是真正私有的(除非你做很多不必要的工作)。”
还有:
“如果你的类是打算被继承的,而你有一些不希望子类使用的属性,可以考虑用两个下划线开头,后面不加下划线来命名它们。”
如果你还没读过这一整部分,我建议你去看看。
更新:
为了回答这个问题(现在标题已经改了)。在Python中使用私有变量的正确方式是不使用私有变量。在Python中,试图隐藏某些东西通常不被认为是符合Python风格的做法。
在Python中,所有东西都是public
的,也就是说,任何人都可以访问。前面加上__
只是个约定,表示这个函数是内部实现的细节,最好不要直接使用。
这种做法并不是语言或运行时强制执行的,虽然这些名字看起来有点复杂,但它们仍然是public
的,任何想用它们的代码都能看到。
在Python的惯用法中,不会使用获取和设置的函数,因为没有private
的范围,这样做只是重复劳动。
你只有在想要间接访问某个成员变量时,才会使用这些获取和设置的函数。这时,你可以在成员变量的名字前加上__
,然后提供一个实际的函数名。
你可以花很多功夫写大量代码,试图用描述符和元编程来保护用户不犯错,但最终你会发现代码变得更多,测试和维护的工作也会增加,而且仍然不能保证不会出问题。别担心,Python已经这样活了20年,所以这也没什么大不了的。