Python 的“私有”方法:并不像看起来那么难以理解
尽管人们误认为 Python 的“私有”方法提供了强大的封装性,但仔细检查就会发现它们并不是真正的私有。虽然在方法前添加双下划线 (__myPrivateMethod()) 表示私有作用域,但它实际上创建了一个具有修改名称的方法。
例如,以下类演示了此行为:
class MyClass: def myPublicMethod(self): print('public method') def __myPrivateMethod(self): print('this is private!!')
当实例化此类的对象时,人们会期望无法访问私有的方法:
obj = MyClass() obj.myPublicMethod()
但是,后续的 dir(obj) 调用揭示了一个神奇创建的方法的存在:
dir(obj) ['_MyClass__myPrivateMethod', '__doc__', '__module__', 'myPublicMethod']
调用此方法揭示了“私有”数据:
obj._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() # 42 x.bar() # 21 print(x.__dict__) # {'_Bar__baz': 21, '_Foo__baz': 42}
综上所述,Python 的“私有”方法并不是真正私有的,允许子类访问它们。这种设计选择优先考虑子类化的灵活性而不是严格的封装,但它也需要开发人员谨慎使用以维护代码完整性。
以上是Python 的'私有”方法到底有多私有?的详细内容。更多信息请关注PHP中文网其他相关文章!