擅长:python、mysql、java
<p>这是因为<a href="http://docs.python.org/2/tutorial/classes.html#private-variables-and-class-local-references" rel="nofollow"><em>name mangling</em></a>正在发生。在</p>
<ul>
<li><code>expressionType</code>在<code>Expression</code>中定义。在</li>
<li><code>n.__expressionType</code>将转换为<code>n._Expression__expressionType</code>。在</li>
<li>如果将相同的<code>expressionType</code>方法复制粘贴到类<code>Number</code>,那么由于方法解析顺序的原因,它将转到<code>Number</code>中出现的定义,其中<code>self.__expressionType</code>表示{<cd9>}。在</li>
</ul>
<p><code>n._Expression__expressionType</code>!=<code>n._Number__expressionType</code>。在</p>
<p>这实际上是可行的:</p>
<pre><code>class Expression(Node):
def __init__(self):
self.__expressionType = None
def expressionType(self):
return self.__expressionType
class Number(Expression):
def __init__ (self, value):
Expression.__init__(self)
assert isinstance (value, KST.Constant)
self.__constant = value
self.__expressionType = value.elementType()
def expressionType (self):
return self.__expressionType
</code></pre>
<p>但是,存在代码重复,因此使用一个下划线更好,因为它不会损坏属性的名称。在</p>