2

可能重复:
Python 中的私有名称修改有什么好处?

当我在玩python时,我发现如果classinstance变量名以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 是共同的,但对于某些函数/方法,我们只期望/假设这些类中的一个。在这种情况下,有可能没有进行类型检查,并且当另一个类实例传递给它时(可能是错误的)可能会导致错误和/或不良行为。

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

4

2 回答 2

3

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

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

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

于 2012-12-14T14:20:45.863 回答
1

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

考虑以下:

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

This essentially can be used to separate some of the behavior of the parent class (MyClass) from the behavior of the child class (MyClass2)

于 2012-12-14T14:24:04.043 回答