【问题标题】:Significance and use of instance/class attributes with leading double underscores(special behaviour) [duplicate]带有前导双下划线的实例/类属性的意义和使用(特殊行为)[重复]
【发布时间】:2012-12-14 14:18:40
【问题描述】:

可能重复:
What is the benefit of private name mangling in Python?

我在玩python的时候发现class或者instance变量名如果以2个下划线开头,会被重命名为前面加'_'。

例如

class Test(object):
    __attribute = "dunderscored"
    def __init__(self, value=0):
        self.__instance_attribute = value


test_instance = Test()

那么这两个变量都会被重命名为

test_instance._Test__attributetest_instance._Test__instance_attribute

为什么会有这样的行为/功能?有什么需要,或者有什么特殊用途吗?

我可以想到一个用例,当不同的类有一些具有通用名称的属性时,例如。 value、id、member 是共同的,但对于某些函数/方法,我们只期望/假设这些类中的一个。在这种情况下,有可能没有进行类型检查,当另一个类实例(可能是错误的)传递给它时,可能会导致错误和/或不良行为。

但除了这个用例之外,我看不到这种特殊行为的任何好处。这种行为看起来像是一个功能,非常基本的功能,我觉得我在这里遗漏了一些东西。如果它是一个功能,它有什么用?有什么典型用例吗?

【问题讨论】:

    标签: python attributes naming instance-variables class-variables


    【解决方案1】:

    使用双下划线前缀称为名称修饰:(来自Python docs):

    __spam 形式的任何标识符(至少两个前导下划线,最多一个尾随下划线)在文本上替换为 _classname__spam,其中类名是当前类名,前导下划线被去除。这种修饰是在不考虑标识符的语法位置的情况下完成的,因此它可以用于定义类私有实例和类变量、方法、存储在全局变量中的变量,甚至是存储在实例中的变量。在其他类的实例上对此类私有。

    注意,单个下划线前缀用于表示变量/函数/类应该是私有的(尽管这不是严格强制执行的)

    【讨论】:

      【解决方案2】:

      此功能有助于避免子类化时名称与属性发生冲突。

      考虑以下几点:

      class MyClass1(object):
          def __init__(self):
               self.__attribute = 3
      
          def doSomething(self):
               print(self.__attribute)
      
      class MyClass2(MyClass1):
          def __init__(self):
               MyClass1.__init__(self)
               self.__attribute = 4
      
          def doSomething2(self):
               print(self.__attribute)
      

      现在如果你创建一个实例:

      x = MyClass2()
      x.doSomething() #prints 3
      x.doSomething2() #prints 4
      

      这本质上可用于将父类 (MyClass) 的某些行为与子类 (MyClass2) 的行为分开

      【讨论】:

      • 我在这里看不到子类化(除了来自object)...
      • @glglgl -- D'oh -- 谢谢。固定。
      猜你喜欢
      • 2011-10-19
      • 2016-12-03
      • 1970-01-01
      • 2013-04-25
      • 2023-03-19
      • 2013-02-21
      • 2011-07-24
      • 2011-08-28
      • 2013-01-18
      相关资源
      最近更新 更多