Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/363.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python奇怪的重写行为__&引用;功能_Python_Function_Private - Fatal编程技术网

Python奇怪的重写行为__&引用;功能

Python奇怪的重写行为__&引用;功能,python,function,private,Python,Function,Private,我在Python中发现“_ju”函数重写的“奇怪”行为 class A(object): def foo1(self): print "foo1 A" self.test1() def foo2(self): print "foo2 A" self.__test2() def test1(self): print "test1 A" def __test2(self):

我在Python中发现“_ju”函数重写的“奇怪”行为

class A(object):

    def foo1(self):
        print "foo1 A"
        self.test1()

    def foo2(self):
        print "foo2 A"
        self.__test2()

    def test1(self):
        print "test1 A"

    def __test2(self):
        print "test2 A"

class B(A):
    def test1(self):
        print "test1 B"

    def __test2(self):
        print "test2 B"

ia = A()
ib = B()
ib.foo1()
ib.foo2()
结果是:

foo1 A
test1 B
foo2 A
test2 A
而不是:

foo1 A
test1 B
foo2 A
test2 B

这是Python“\uuu”函数的正常行为吗?

您看到的行为是在类属性或方法中使用前导双下划线名称的意图

带有前导双下划线的名称为“损坏”;将类的名称作为前缀,以明确防止名称与子类冲突

请参见参考文档中的:


类的私有名称。当在类定义的上下文中使用此类别中的名称时,会重新编写以使用损坏的形式,以帮助避免基类和派生类的“私有”属性之间的名称冲突

(强调矿山)

另请参见文档中的表达式:

私有名称混乱:当类定义中以文本形式出现的标识符以两个或多个下划线字符开头,而不是以两个或多个下划线结尾时,它被视为该类的私有名称。在为私有名称生成代码之前,会将其转换为更长的形式。转换将在名称前面插入类名,删除前导下划线并插入一个下划线。例如,出现在名为
Ham
的类中的标识符
\uuu spam
将转换为
\uham\uu spam
。此转换独立于使用标识符的语法上下文。如果转换后的名称非常长(超过255个字符),则可能会发生实现定义的截断。如果类名只包含下划线,则不进行任何转换


您看到的行为是在类属性或方法中使用前导双下划线名称的意图

带有前导双下划线的名称为“损坏”;将类的名称作为前缀,以明确防止名称与子类冲突

请参见参考文档中的:


类的私有名称。当在类定义的上下文中使用此类别中的名称时,会重新编写以使用损坏的形式,以帮助避免基类和派生类的“私有”属性之间的名称冲突

(强调矿山)

另请参见文档中的表达式:

私有名称混乱:当类定义中以文本形式出现的标识符以两个或多个下划线字符开头,而不是以两个或多个下划线结尾时,它被视为该类的私有名称。在为私有名称生成代码之前,会将其转换为更长的形式。转换将在名称前面插入类名,删除前导下划线并插入一个下划线。例如,出现在名为
Ham
的类中的标识符
\uuu spam
将转换为
\uham\uu spam
。此转换独立于使用标识符的语法上下文。如果转换后的名称非常长(超过255个字符),则可能会发生实现定义的截断。如果类名只包含下划线,则不进行任何转换


这是不使用
\uuuufoo
名称的许多好理由之一。它们不是“私人的”,它们只是让人困惑和奇怪。这是不使用
\uuufoo
名称的许多好理由之一。他们不是“私人的”,他们只是混乱和怪异。