Ale*_*yna 0 python variables accessor private-members
我有一个python模块,m1.
# m1.py
class C1(object):
def __init__(self):
self.__pri = 10
self._pro = 5
self.pub = 1
Run Code Online (Sandbox Code Playgroud)
然后在bpython中,
>>> import m1
>>> c = m1.C1()
>>> c.__pri
Traceback (most recent call last):
File "<input>", line 1, in <module>
AttributeError: 'C1' object has no attribute '__pri'
>>> c._pro
5
>>> c.pub
1
>>> dir(c)
['_C1__pri', '__class__', '__delattr__', '__dict__', '__doc__', '__format__', '__getattribute__', '__hash__', '__init__', '__module__', '__new__', '__reduce__',
'__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', '_pro', 'pub']
>>> c._C1__pri
10
Run Code Online (Sandbox Code Playgroud)
我以为python中没有私有变量的概念.我们现在如何解释这种行为?
编辑:我本来期待直接访问c .__ pri,但事实证明这name mangling阻止了我这样做,如下所述.谢谢大家!
双下划线使用属性修改类名称,前缀为单个下划线
c._C1__pri
Run Code Online (Sandbox Code Playgroud)
允许访问该属性.一种伪隐私,但它有其他用途.我不确定你预期会发生什么c.__private.我认为你的意思是c.__pri尽管结果会是一样的.
该__pri属性不是私有的,因为它可以在类外部访问,只需要几个字符就可以了.
正如下面提到的jadkik94,这不是为了让它无法访问,而是向另一个程序员发出信号,告诉他们不应该使用该属性.
另外一次这可能会派上用场时使用继承
class Parent:
def __method(self):
print 'Parent method'
class Child(Parent):
def __method(self):
print 'Child method'
>>> c = Child()
>>> c._Child__method()
Child method
>>> c._Parent__method()
Parent method
Run Code Online (Sandbox Code Playgroud)
双下划线防止意外覆盖名称(不是经常看到).