2016-12-28 23 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 

不要使用此功能,试图表明的方法是“私人”。为此,只需使用一个下划线。名称修改功能用于在一些罕见和复杂的继承情况下防止名称冲突。

相关问题