2011-07-14 66 views
11

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

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)) 
+0

可能的复制名字?](http://stackoverflow.com/questions/1301346/what-is-the-meaning-of-a-single-and-a-double-unde rscore-before-an-object-name) – xli

回答

1

这是一个约定,声明类/对象的客户端应尽量避免使用这些属性,因为它们是供内部使用的。

12

_表示这些是私人成员。它不以任何方式由语言强制执行,因为Python程序员都是“consenting adults”。

+0

所以下划线表示“私有实例变量”,但python不强制它,对吧?这只是一个惯例。 – TIMEX

+1

是的,如果你这样做(从外部访问),python不会强制或抱怨。它通常被开发人员用来找出内部使用哪个变量与哪个变量是从外部引用或作为实例变量 – 2015-07-08 11:51:09

+0

之间的区别。但是,我宁愿使用语言来强制执行,因为它没有任何意义,否则允许访问对于没有真正理由的来自外部的内部变量 – 2015-07-08 11:52:37

2

它暗示仅限内部使用(与其他语言中的私人使用类似),但不像其他语言那样受到限制。

11

根据PEP 8

此外,使用前导或尾随 下划线以下特殊形式被识别(这些一般可以用任何情况下 惯例相结合):

  • _single_leading_underscore:弱的“内部使用”指标。例如。 “来自M import *”不会导入名称以下划线开头的对象。

实际上它并不指在一个类的成员,使用以单下划线的,但这些往往被用于暗示“内部使用”。对于更强大的版本,使用两个前导下划线(例如self.__foo) - Python将会更有力地防止子类意外覆盖成员,但确定的代码当然仍然可以。

+0

所以基本上,我不需要使用下划线。正确? – TIMEX

+0

@TIMEX:不,你不需要使用它。即使你这样做,没有人需要尊重它。但这是一个相当常见的惯例,所以使用它也不会带来任何伤害。 –

+3

@TIMEX:这是“约定”这个词的定义,是的。它没有被执行,但它并没有受到伤害,并且通常有助于遵守它。 – Santa

0

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

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

所以

self.name = a

self._name =a

self.__name=a

是【什么是单和双下划线的含义的对象之前所有相同

+4

他们实际上并不完全相同,至少不是可以互换的。您需要使用任何名称(无论是0,1还是2前导下划线)来访问该属性。下划线用作程序员的通知,但解释者不执行“仅供内部使用”的建议。 –

相关问题