为什么 Python 的“私有”方法实际上不是私有的
尽管双下划线前缀通常用于在 Python 中表示“私有”方法,用户可以通过稍微不同的命名约定来访问这些方法。
Python 解释器重命名这些“私有”方法为“_ClassName__MethodName”。因此,所谓的“私有”方法“__myPrivateMethod()”可以作为“_MyClass__myPrivateMethod()”来调用。
此名称加扰并非旨在作为一种封装形式或防止外部访问。相反,它用于确保子类不会无意中覆盖其超类的“私有”方法。
考虑以下示例:
class Foo(object): def __init__(self): self.__baz = 42 def foo(self): print(self.__baz) class Bar(Foo): def __init__(self): super(Bar, self).__init__() self.__baz = 21 def bar(self): print(self.__baz)
当我们创建 Bar 的实例并调用无论是 foo() 还是 bar(),我们都会看到以下输出:
x = Bar() x.foo() 42 x.bar() 21
如输出所示,子类成功覆盖 __baz 的值,而不影响超类的“私有”属性。此外,访问 x.__dict__ 显示 __baz 属性的两个版本在子类实例中共存。
虽然此名称加扰可能会阻止意外覆盖,但它并不能阻止从外部源有意访问“私有”方法。因此,Python 的“私有”方法并不是真正私有的,不应该依赖于封装。
以上是Python 的'私有”方法真的是私有的吗?的详细内容。更多信息请关注PHP中文网其他相关文章!