如何在python中访问`conventional`私有变量?

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阻止了我这样做,如下所述.谢谢大家!

Rya*_*ing 5

双下划线使用属性修改类名称,前缀为单个下划线

    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)

双下划线防止意外覆盖名称(不是经常看到).

  • 你应该提到这一点的全部意义是**不是**意思是私人的,因为"你不能使用这个",而是私人的,因为你"不应该使用这个" (2认同)