<p>Python没有<code>private</code>函数的概念。但是,它确实处理了名称以至少两个下标线开始、最多以一个下标线结尾的类属性,它会对名称进行处理,使它们更难访问。在这个例子中,您可以看到函数<code>__func2</code>的名称被弄错了。仍然可以访问和调用函数-但是您必须做出特别的努力来执行此操作,只需调用<code>o.func2()</code>失败:</p>
<pre><code>james@bodacious:tmp$cat test.py
class myclass:
def func1(self):
print "one"
def __func2(self):
print "two"
o = myclass()
print dir(o)
o._myclass__func2()
o.func2()
james@bodacious:tmp$python test.py
['__doc__', '__module__', '_myclass__func2', 'func1']
two
Traceback (most recent call last):
File "test.py", line 15, in <module>
o.func2()
AttributeError: myclass instance has no attribute 'func2'
james@bodacious:tmp$
</code></pre>
<p>为了回答你的问题:</p>
<blockquote>
<p>How do you correctly use private functions in Python?</p>
</blockquote>
<p>答案是:就像任何其他函数一样,但是你必须知道这个错误的名称。在</p>
<p>接下来是你想问的问题:</p>
^{pr2}$
<p>来自154号线:</p>
<pre><code>self._matrix.__loadVec(vec,res)
</code></pre>
<p>错误消息告诉您,名为<code>self</code>的对象是<code>matrix</code>类的实例;但它没有名为<code>_matrix</code>的属性。参考上面的<code>__savetoMatrix</code>函数,看起来该属性只是名为<code>matrix</code>-因此需要将其称为<code>self.matrix</code>(“名为<code>self</code>的对象的<code>matrix</code>的属性)。在</p>
<p>此<code>__savetoMatrix</code>函数引用<code>self.matrix</code>,而不是{<cd14>}。在</p>
<p>然而,这里还有一个更深层次的问题。从行与行之间看,这段代码似乎来自一个名为<code>matrix</code>的类;该类的实例有一个名为<code>matrix</code>的属性。当您调用<code>self.matrix.__loadVec()</code>时,您正在调用名为<code>__loadvec()</code>的函数,该函数绑定到绑定到名为<code>self</code>的对象的属性<code>matrix</code>。在</p>
<p>即使这是您想要做的,这也无法工作,因为上面概述的名称混乱-假设名为<code>matrix</code>的属性具有类<code>inner_matrix</code>,那么您必须将函数称为<code>self._matrix._inner_matrix__loadVec()</code></p>
<p>我认为您实际要做的是调用在类<code>matrix</code>中定义的<code>__loadVec()</code>方法。为此,只需调用<code>self.__loadVec()</code>。因为这是对同一个类中的函数的调用,所以您甚至不必担心名称的损坏-这些函数是要在类中使用的,解释器将为您处理这些损坏。在</p>
<pre><code>james@bodacious:tmp$cat test.py
class myclass:
def func1(self):
print "one"
def __func2(self):
print "two"
def func3(self):
self.__func2()
print "three"
o = myclass()
print dir(o)
o.func3()
james@bodacious:tmp$python test.py
['__doc__', '__module__', '_myclass__func2', 'func1', 'func3']
two
three
</code></pre>