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

Способ реализации частной переменной экземпляра под названием имя mangling. См. Doc Private Variables and Class-local References

... такой механизм, называемый под названием mangling. Любой идентификатор формы __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 

Не использовать эту функцию, чтобы попытаться указать метод является "частный". Для этого просто используйте одно подчеркивание. Функция изменения имени предназначена для предотвращения столкновений имен в некоторых редких и сложных ситуациях наследования.

Смежные вопросы