Python为我们提供了在类中创建“private”方法和变量的能力,方法是在名称前加上双下划线,例如:__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不支持封装,所以为什么还要尝试呢?有什么好处?