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

8 投票
5 回答
8217 浏览
提问于 2025-04-17 03:41

我最近在StackOverflow上发了一个问题,并得到了答案。

有人给我提了一些关于编码风格的建议,但我还没有收到更多的反馈。现在我有一些与之前问题相关的新问题。

  1. 在Python中,我们怎么在类里面声明私有变量?我以为用两个下划线(__)就可以把变量当作私有的。请纠正我。

  2. 根据之前收到的建议,我们不需要使用getter或setter方法。那我们是不是应该用getter或setter,或者两者都用呢?请告诉我你对此的看法。

5 个回答

1

你可以用Python的属性来代替获取器和设置器。只需使用一个实例属性,当你需要更复杂的功能时,可以把这个属性变成一个属性,而不需要修改太多代码。

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

6

PEP 8(http://www.python.org/dev/peps/pep-0008/)里有一部分讲的是“为继承设计”,这部分内容可以解决大部分相关的问题。

引用一下里面的话:

“我们这里不使用‘私有’这个词,因为在Python中,没有哪个属性是真正私有的(除非你做很多不必要的工作)。”

还有:

“如果你的类是打算被继承的,而你有一些不希望子类使用的属性,可以考虑用两个下划线开头,后面不加下划线来命名它们。”

如果你还没读过这一整部分,我建议你去看看。

更新:

为了回答这个问题(现在标题已经改了)。在Python中使用私有变量的正确方式是使用私有变量。在Python中,试图隐藏某些东西通常不被认为是符合Python风格的做法。

10

在Python中,所有东西都是public的,也就是说,任何人都可以访问。前面加上__只是个约定,表示这个函数是内部实现的细节,最好不要直接使用。

这种做法并不是语言或运行时强制执行的,虽然这些名字看起来有点复杂,但它们仍然是public的,任何想用它们的代码都能看到。

在Python的惯用法中,不会使用获取和设置的函数,因为没有private的范围,这样做只是重复劳动。

你只有在想要间接访问某个成员变量时,才会使用这些获取和设置的函数。这时,你可以在成员变量的名字前加上__,然后提供一个实际的函数名。

你可以花很多功夫写大量代码,试图用描述符和元编程来保护用户不犯错,但最终你会发现代码变得更多,测试和维护的工作也会增加,而且仍然不能保证不会出问题。别担心,Python已经这样活了20年,所以这也没什么大不了的。

撰写回答