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 "<stdin>", line 1, in <module>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 "<stdin>", line 1, in <module>AttributeError: MyClass instance has no attribute '__myPrivateMethod'
这里的一切看起来都很好;我们无法调用它。事实上,它是“私有的”。好吧,实际上不是。在对象上运行dir()
揭示了Python为您的所有“私有”方法神奇地创建的新神奇方法。
>>> dir(obj)['_MyClass__myPrivateMethod', '__doc__', '__module__', 'myPublicMethod']
这个新方法的名称始终是下划线,后跟类名,后跟方法名。
>>> obj._MyClass__myPrivateMethod()this is private!!
这么多的封装,嗯?
无论如何,我总是听说Python不支持封装,那为什么还要尝试呢?是什么给了?