Python单下划线和双下划线变量的问题

2024-09-26 22:49:43 发布

您现在位置:Python中文网/ 问答频道 /正文

我不确定我做错了什么,或者为什么会这样。在

我有以下代码:

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-

^{pr2}$

现在,如果我把双下划线改成单下划线,一切都可以。我理解私有变量和半私有变量之间的区别,但为什么会这样——我不知道。另外,我在其他很多地方也用过“uuu”,看起来效果不错。在


Tags: 代码selfnonenodenumberreturninitvalue
3条回答

带有双下划线的属性名是“mangled”,这样子类中就更难有冲突的名称了。在

所以使用单下划线。在

这是因为name mangling正在发生。在

  • expressionTypeExpression中定义。在
  • n.__expressionType将转换为n._Expression__expressionType。在
  • 如果将相同的expressionType方法复制粘贴到类Number,那么由于方法解析顺序的原因,它将转到Number中出现的定义,其中self.__expressionType表示{}。在

n._Expression__expressionType!=n._Number__expressionType。在

这实际上是可行的:

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

但是,存在代码重复,因此使用一个下划线更好,因为它不会损坏属性的名称。在

正如其他人所指出的,“命名混乱”发生了。但那到底是什么?让我们看一个例子。在

创建一个实例:

class A():
  var1=10
  __var2=20

a=A()

访问A的第一个变量:

^{pr2}$

访问A的第二个变量:

>>> a.__var2
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: A instance has no attribute '__var2'

请注意错误A instance has no attribute '__var2'。但是,您可以通过以下方式访问:

>>> a._A__var2
20

因此,简单地说,每当在一个方法或变量前面有两个双倍分数(或更多)时,Python会通过在方法或变量前面添加一个下划线和类名来更改该方法或变量的名称。这是一种技巧,这样程序员就不会因为错误地更改值而把事情搞砸。在

相关问题 更多 >

    热门问题