在Python中,实例变量前面的下划线是什么意思?

16

这是什么约定?

class IndexedText(object):
    def __init__(self, stemmer, text):
        self._text = text
        self._stemmer = stemmer
        self._index = nltk.Index((self._stem(word), i) for (i, word) in enumerate(text))

5个回答

19

_ 表示这些是私有成员。它并没有被语言强制执行,因为 Python 程序员都是“自愿的成年人”。


所以下划线表示“私有实例变量”,但Python并不强制执行,对吧?这只是一种约定。 - TIMEX
2
是的,Python 不会强制要求或抱怨如果你从外部访问变量。通常开发者采用这种方式来区分内部使用的变量和需要从外部或作为实例变量引用的变量之间的差异。 - user966588
然而,我更喜欢强制语言执行,因为否则没有真正的理由允许从外部访问内部变量。 - user966588
它真的是私有的还是受保护的,即子类可以访问Parent._method()? - Claudiu Creanga

13
根据PEP 8
此外,以下使用前导或尾随下划线的特殊形式被认可(这些通常可以与任何大小写约定结合使用):
- `_single_leading_underscore`:弱的“内部使用”指示器。例如,`from M import *`不会导入名称以下划线开头的对象。 它实际上并不是指类成员中使用单个下划线,但这些倾向于用于暗示“内部使用”。
要使用更强的版本,请使用两个前导下划线(例如,`self.__foo`)。Python将更努力地防止子类意外覆盖成员,但是决心的代码当然仍然可以这样做。
- `__double_leading_underscore`:在命名类属性时,调用名称重整(在类FooBar内,`__boo`变成`_FooBar__boo`;请参见下文)。

所以基本上,我不需要使用下划线。对吗? - TIMEX
@TIMEX:不,你不需要使用它。即使你使用了它,也没有人需要尊重它。但是这是一个相当普遍的约定,因此使用它也不会有什么坏处。 - Daniel Pryden
3
@TIMEX: 是的,这就是“惯例”一词的定义。它没有被强制执行,但遵循它通常会有帮助而且不会有任何损失。 - Santa

2

这意味着“仅限内部使用”(类似于其他语言中的“私有”),但不像其他语言那样受到限制。


1

这是一种约定,规定类/对象的客户端应尽可能避免使用这些属性,因为它们是用于内部使用的。


1

这只是意味着那些属性仅供内部使用,如果可能的话,请不要触碰它们。

假设您正在编辑一些现有代码,并且看到带有下划线的变量。这意味着您不应该编辑它们。只是一个警告。

所以

self.name = a

self._name =a

self.__name=a

都是一样的


6
它们实际上并不完全相同,至少不能互换使用。你需要使用其定义的属性名称来访问该属性(无论它是以0、1或2个下划线开头)。这些下划线作为程序员的提示,但解释器不强制执行“仅供内部使用”的建议。 - John T

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接