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 部分,无论它是函数、方法还是数据成员
这就是为什么这是“标准”,与其他语言略有不同。
- 没有下划线表示 public class 的用户可以 touch/modify/use
- 一个下划线更多的是一个实现细节,usually(注意通常这个词)在子classes中应该只referenced/used或者如果你知道你在做什么。 python 的美妙之处在于我们都是成年人,如果有人想要访问一些真正自定义的东西,那么他们应该能够。
- 两个下划线的名称被破坏以包含 class 名称,就像这样
_Temp__c
在幕后防止您的变量与 subclass 冲突。但是,我会避免默认为两个,因为这不是一个好习惯,而且通常是不必要的。关于它的争论和其他帖子你可以阅读
注意:与 variables/methods 有无下划线没有区别。这只是 classes 的约定,并未强制执行,而是被社区接受为私有的。
注 #2:Matthias 描述了非 class 方法的例外情况
我看到在下划线的帮助下,可以在 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 部分,无论它是函数、方法还是数据成员
这就是为什么这是“标准”,与其他语言略有不同。
- 没有下划线表示 public class 的用户可以 touch/modify/use
- 一个下划线更多的是一个实现细节,usually(注意通常这个词)在子classes中应该只referenced/used或者如果你知道你在做什么。 python 的美妙之处在于我们都是成年人,如果有人想要访问一些真正自定义的东西,那么他们应该能够。
- 两个下划线的名称被破坏以包含 class 名称,就像这样
_Temp__c
在幕后防止您的变量与 subclass 冲突。但是,我会避免默认为两个,因为这不是一个好习惯,而且通常是不必要的。关于它的争论和其他帖子你可以阅读
注意:与 variables/methods 有无下划线没有区别。这只是 classes 的约定,并未强制执行,而是被社区接受为私有的。
注 #2:Matthias 描述了非 class 方法的例外情况