为什么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()

我在那里所做的是创建一个具有公共方法和私有方法的类,并将其实例化。

接下来,我将其称为public方法。

>>> obj.myPublicMethod()

public method

接下来,我尝试调用其私有方法。

>>> obj.__myPrivateMethod()

Traceback (most recent call last):

File "", line 1, in

AttributeError: MyClass instance has no attribute '__myPrivateMethod'

这里看起来一切都很好。我们无法调用它。实际上,它是“私有”的。好吧,实际上不是。在对象上运行dir()揭示了python为所有“私有”方法神奇地创建的新的神奇方法。

>>> dir(obj)

['_MyClass__myPrivateMethod', '__doc__', '__module__', 'myPublicMethod']

此新方法的名称始终是下划线,其后是类名,然后是方法名。

>>> obj._MyClass__myPrivateMethod()

this is private!!

封装这么多,是吗?

无论如何,我总是会听到Python不支持封装,那么为什么还要尝试呢?是什么赋予了?

回答:

名称加扰用于确保子类不会意外覆盖其超类的私有方法和属性。它并非旨在防止从外部故意访问。

例如:

>>> 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的“私有”方法实际上不是私有的? 的全部内容, 来源链接: utcz.com/qa/420170.html

回到顶部