擅长:python、mysql、java
<p>到目前为止,答案很好,但有些小道消息却不见了。单个前导下划线并不完全是一种约定:如果使用<code>from foobar import *</code>,并且模块<code>foobar</code>未定义<code>__all__</code>列表,则从模块导入的名称不包括带有前导下划线的名称。假设它主要是一个惯例,因为这个例子是一个非常模糊的角落;-)。</p>
<P>主要的下划线约定不仅广泛用于<EM>私有EME>名称,而且还用于C++所称的<EM>受保护的<EEM>类——例如,完全被类(甚至是<强> > <>强>的方法的名称,在基类中被重写,因为它们{{CD4}}!-)通常是一个前导下划线名称,用该类(或子类)的实例来指示代码<strong>,该类(或子类)不打算直接调用所述方法。</p>
<p>例如,要使线程安全的队列具有不同于FIFO的排队规则,可以导入queue、子类queue.queue并重写诸如<code>_get</code>和<code>_put</code>;“客户机代码”从不调用那些(“hook”)方法,而是调用诸如<code>put</code>和<code>get</code>(这称为<a href="http://en.wikipedia.org/wiki/Template_method_pattern" rel="noreferrer">Template Method</a>设计)的公共方法模式——请参见<a href="http://www.catonmat.net/blog/learning-python-design-patterns-through-video-lectures/" rel="noreferrer">here</a>,这是一个有趣的演示,它基于我关于这个主题的一段谈话的视频,并添加了转录本的摘要)。</p>
<p>编辑:谈话内容中的视频链接现已断开。您可以找到前两个视频<a href="https://www.youtube.com/watch?v=1Sbzmz1Nxvo" rel="noreferrer">here</a>和<a href="https://www.youtube.com/watch?v=tJXhtncDBu4" rel="noreferrer">here</a>。</p>