我不确定我做错了什么,或者为什么会这样。在
我有以下代码:
class Expression (Node):
"""
...
"""
def __init__ (self):
self.__expressionType = None
def expressionType (self):
return self.__expressionType
class Number (Expression):
"""
Number .
"""
def __init__ (self, value):
"""
Value is an entry of type Constant.
"""
Expression.__init__(self)
assert isinstance (value, KST.Constant)
self.__constant = value
self.__expressionType = value.elementType()
对于一个number对象,比如n = Number(KST.Constant(..))
,对于下面的语句,总是返回None-
现在,如果我把双下划线改成单下划线,一切都可以。我理解私有变量和半私有变量之间的区别,但为什么会这样——我不知道。另外,我在其他很多地方也用过“uuu”,看起来效果不错。在
带有双下划线的属性名是“mangled”,这样子类中就更难有冲突的名称了。在
所以使用单下划线。在
这是因为name mangling正在发生。在
expressionType
在Expression
中定义。在n.__expressionType
将转换为n._Expression__expressionType
。在expressionType
方法复制粘贴到类Number
,那么由于方法解析顺序的原因,它将转到Number
中出现的定义,其中self.__expressionType
表示{n._Expression__expressionType
!=n._Number__expressionType
。在这实际上是可行的:
但是,存在代码重复,因此使用一个下划线更好,因为它不会损坏属性的名称。在
正如其他人所指出的,“命名混乱”发生了。但那到底是什么?让我们看一个例子。在
创建一个实例:
访问A的第一个变量:
^{pr2}$访问A的第二个变量:
请注意错误
A instance has no attribute '__var2'
。但是,您可以通过以下方式访问:因此,简单地说,每当在一个方法或变量前面有两个双倍分数(或更多)时,Python会通过在方法或变量前面添加一个下划线和类名来更改该方法或变量的名称。这是一种技巧,这样程序员就不会因为错误地更改值而把事情搞砸。在
相关问题 更多 >
编程相关推荐