为什么Python的“私有”方法实际上不是私有的?
Python使我们能够通过在名称前加上双下划线来创建类中的“私有”方法和变量,如下所示:__myPrivateMethod()..那么,如何解释这一点呢?>>> class MyClass:... def myPublicMethod(self):... print 'public method'... def __myPrivateMethod(self):...
print 'this is private!!'... >>> obj = MyClass()>>> obj.myPublicMethod()public method
>>> obj.__myPrivateMethod()Traceback (most recent call last):
File "", line 1, in AttributeError: MyClass instance has no attribute '__myPrivateMethod'>>> dir(obj)['_MyClass__myPrivateMethod', '_
_doc__', '__module__', 'myPublicMethod']>>> obj._MyClass__myPrivateMethod()this is private!!
怎么回事?!
我给那些不太明白的人解释一下。>>> class MyClass:... def myPublicMethod(self):... print 'public method'... def __myPrivateMethod(self):...
print 'this is private!!'... >>> obj = MyClass()
我所做的就是用一个公共方法和一个私有方法创建一个类并实例化它。
接下来,我称之为它的公共方法。>>> obj.myPublicMethod()public method
接下来,我尝试调用它的私有方法。>>> obj.__myPrivateMethod()Traceback (most recent call last):
File "", line 1, in AttributeError: MyClass instance has no attribute '__myPrivateMethod'
这里一切都很好,我们不能称之为。事实上,它是‘私人的’。其实不是。跑迪尔()在对象上,揭示了python为您的所有“私有”方法神奇地创建的一种新的神奇方法。>>> dir(obj)['_MyClass__myPrivateMethod', '__doc__', '__module__', 'myPublicMethod']
此新方法的名称始终是下划线,后面是类名,后面是方法名。>>> obj._MyClass__myPrivateMethod()this is private!!
封装就这么多了,嗯?
在任何情况下,我都听说Python不支持封装,那么为什么还要尝试呢?什么给予?