python 中的单下划线与双下划线封装

single underscore vs double underscore encapsulation in python

我看到在下划线的帮助下,可以在 class 中声明私有成员,但是如果有一个分数,它仍然可以在 main 中访问,但是有两个则不能。如果两个使变量私有,那么为什么只有一个得分为一?单下划线变量的use/purpose是什么?

class Temp:
    def __init__(self):
    self.a = 123
    self._b = 123
    self.__c = 123

obj = Temp()
print(obj.a)
print(obj._b)
print(obj.__c)

在Python中,没有存在“私有”实例变量,只能在对象内部访问。
但是,大多数 Python 代码和编码人员都遵循一个约定,即名称以下划线为前缀,例如_xyz 应被视为 API 或任何 Python 代码的非 public 部分,无论它是函数、方法还是数据成员

这就是为什么这是“标准”,与其他语言略有不同。

  1. 没有下划线表示 public class 的用户可以 touch/modify/use
  2. 一个下划线更多的是一个实现细节,usually(注意通常这个词)在子classes中应该只referenced/used或者如果你知道你在做什么。 python 的美妙之处在于我们都是成年人,如果有人想要访问一些真正自定义的东西,那么他们应该能够。
  3. 两个下划线的名称被破坏以包含 class 名称,就像这样 _Temp__c 在幕后防止您的变量与 subclass 冲突。但是,我会避免默认为两个,因为这不是一个好习惯,而且通常是不必要的。关于它的争论和其他帖子你可以阅读

注意:与 variables/methods 有无下划线没有区别。这只是 classes 的约定,并未强制执行,而是被社区接受为私有的。
注 #2:Matthias 描述了非 class 方法的例外情况