为什么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 的“私有”方法实际上不是私有的?
2022-03-22 关注 0 浏览47 1答案
-
为什么在私有锁上使用私有锁?
2021-01-30 关注 0 浏览65 1答案
-
程序计数器为什么是私有的?
2019-12-27 关注 0 浏览1409 1答案
-
为什么Java中的实例变量总是私有的?
2021-01-31 关注 0 浏览68 1答案
-
虚拟机栈和本地方法栈为什么是私有的?
2019-12-27 关注 0 浏览1928 1答案
-
为什么枚举可以具有包私有的构造函数?
2021-01-31 关注 0 浏览62 1答案
-
为什么我可以调用私有方法?
2021-01-30 关注 0 浏览101 1答案
-
为什么我可以从main方法访问私有变量?
2021-01-30 关注 0 浏览141 1答案
-
为什么Spring允许在私有方法上使用控制器注释的请求映射?
2021-02-02 关注 0 浏览107 1答案
-
java @SafeVarargs为什么私有方法需要是最终的
2021-01-30 关注 0 浏览124 1答案