2016-12-28 41 views
0

我是想看看我能不能叫蟒蛇類的私有函數,我想在IPython中:python類未能提供_Secretive__xxx()函數,爲什麼?

In [14]: class C: 
    ....:  def __my(s): 
    ....:   print "hello" 
    ....:  

In [15]: print C 
__main__.C 

In [16]: obj=C() 

In [17]: obj._Secretive__my 
--------------------------------------------------------------------------- 
AttributeError       Traceback (most recent call last) 
<ipython-input-17-c68d82fedeb4> in <module>() 
----> 1 obj._Secretive__my 

AttributeError: C instance has no attribute '_Secretive__my' 
In [18]: obj._Secretive__my() 
--------------------------------------------------------------------------- 
AttributeError       Traceback (most recent call last) 
<ipython-input-18-ab4a9965f82a> in <module>() 
----> 1 obj._Secretive__my() 

嗯,看來我無法統計,或調用它,對嗎?我哪裏錯了?

回答

1

您實現「私有」實例變量的方式稱爲名稱損壞。請參閱文檔Private Variables and Class-local References

...這種機制,稱爲名稱修改。任何__spam形式的標識符(至少兩個前導下劃線,最多一個尾部下劃線)在文本上用_classname__spam替換,其中classname是當前類名稱,前導下劃線被去除。

試試這個:

obj._C__my 
obj._C__my() 
3

方法的名稱是preceded通過_和類名(C):

>>> class C: 
... def __my(self): 
...  print "hello" 
... 
>>> obj = C() 
>>> dir(obj) 
['_C__my', '__doc__', '__module__'] 
>>> obj._C__my() 
hello 

所以,你可以調用該方法,但奇怪的命名轉變應該讓你三思而後行關於這樣做。

1

雙下劃線前綴名獲得mangled using the class name - 即C,在這種情況下:

>>> class C: 
...  def __my(self): 
...   print('hello') 
...   
>>> obj = C() 
>>> obj._C__my() 
hello 

不要使用此功能,試圖表明的方法是「私人」。爲此,只需使用一個下劃線。名稱修改功能用於在一些罕見和複雜的繼承情況下防止名稱衝突。

相關問題