Python 的“私有”方法:揭开封装的神话
与它的名字相反,Python 的“私有”方法并不完全私有。虽然在方法名称前面添加双下划线(例如 __myPrivateMethod())会造成隐私的错觉,但 Python 通过具有修改名称的动态生成的方法公开这些方法。
请考虑以下代码:
class MyClass: def myPublicMethod(self): print('public method') def __myPrivateMethod(self): print('this is private!!') obj = MyClass()
调用 obj.myPublicMethod() 成功调用公共方法。然而,尝试调用 obj.__myPrivateMethod() 会导致 AttributeError。
通过 dir(obj) 深入研究这个问题,我们发现了一个新方法:
dir(obj) # Output: ['_MyClass__myPrivateMethod', '__doc__', '__module__', 'myPublicMethod']
这个动态生成的名为 _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) x = Bar() x.foo() # Output: 42 x.bar() # Output: 21 print(x.__dict__) # Output: {'_Bar__baz': 21, '_Foo__baz': 42}
子类仍然可以通过修改后的名称访问被重写的私有属性或方法。
综上所述,Python 的“私有”方法在面向对象编程原理的感觉。它们只是一种防止意外覆盖的机制,但无法防止故意的外部访问。
以上是Python 的'私有”方法封装是一个神话吗?的详细内容。更多信息请关注PHP中文网其他相关文章!