2012-12-26 48 views
0

我有一個python模塊,m1。如何訪問Python中的常規私有變量?

# m1.py 
class C1(object): 
    def __init__(self): 
     self.__pri = 10 
     self._pro = 5 
     self.pub = 1 

然後在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 

我想沒有在python私有變量的概念。我們現在如何解釋這種行爲?

編輯:我期待訪問c .__ pri直,但事實證明,name mangling阻止我這樣做,如下面的答案。謝謝大家!

+0

你想從我們這裏得到什麼?)是的,它確實是這樣工作的。 – alexvassel

+0

你在這裏預期什麼? –

+2

這是廣泛記錄(http://docs.python.org/2/tutorial/classes.html#private-variables-and-class-local-references),請在問這樣的問題之前做一些研究。 – l4mpi

回答

5

雙下劃線軋液機類名與屬性,由一個下劃線

c._C1__pri 

允許訪問屬性前綴。一種僞隱私,但它有其他用途。 我不確定你期望與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 

雙下劃線防止名字的意外壓倒一切的時候

FYI其他時間,這可能派上用場的(不,這被認爲是非常頻繁)。

+2

你應該提到,整個這一點是**不是**的意思是私人的,因爲在「你不能使用這個」,但私人作爲你「不應該使用這個」 – jadkik94

+0

@ jadkik94我喜歡你的評論。非常有說服力。 Thx – Aleyna

+0

@xhainingx非常感謝您詳細解答答案。 – Aleyna

1
Name Mangling

這提供了一種方法,以聲明一個私人類成員。

這個雙下劃線名稱修改有助於防止覆蓋子類中的內部私有變量。

顯示不應該使用成員變量的典型方法是通過一個下劃線來進行,儘管這只是一個約定。

1

你正在觀察的是name mangling,其中帶有兩個前導下劃線和最多一個尾部下劃線的變量的名稱被重新命名以防止意外地與子類衝突並且防止偶然的黑客修改私有字段。

但是,確定變量的名稱在修改後很容易,因此它不會阻止確定的病態用戶。