Python奇怪的重写行为__&引用;功能
我在Python中发现“_ju”函数重写的“奇怪”行为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):
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
名称的许多好理由之一。他们不是“私人的”,他们只是混乱和怪异。