2016-04-29 1 views
2

Я новичок в Python, изучающем имя mangling (двойное подчеркивание), я выполнил свой поиск и узнал, но у меня есть один вопрос и не могу получить ответ путем поиска: нам не нужно обращаться с именем при работе с другим объектом того же класса в функции класса, правильно? см мой тестовый код:Не нужно упоминать имя для другого объекта того же класса в python?

import math 
class Point: 
    def __init__(self, loc_x, loc_y): 
     self.__x = loc_x 
     self.__y = loc_y 
    def distance(self, other): 
     return math.sqrt((self.__x - other.__x) * (self.__x - other.__x) + (self.__y - other.__y) * (self.__y - other.__y)) 
class Point1: 
    def __init__(self, loc_x, loc_y): 
     self.__x = loc_x 
     self.__y = loc_y 
#two points of same class 
p1 = Point(1,2) 
p2 = Point(2,3) 
print (p1.distance(p2)) 
#object of another point class 
p3 = Point1(4,5) 
print (p1.distance(p3)) 
+1

Какова цель 'класса Point1'? –

+0

«Не нужно менять название» для каких целей? – TigerhawkT3

ответ

2

Название коверкая работает на время компиляции и заменяет имя любого атрибута, начиная с двух подчеркиваний с искаженной версией.

Рассмотрим следующий пример:

>>> class Foo: 
...  def __init__(self): 
...   bar.__x += 1 
... 
>>> import dis 
>>> dis.dis(Foo.__init__) 
    3   0 LOAD_GLOBAL    0 (bar) 
       3 DUP_TOP    
       4 LOAD_ATTR    1 (_Foo__x) 
       7 LOAD_CONST    1 (1) 
      10 INPLACE_ADD   
      11 ROT_TWO    
      12 STORE_ATTR    1 (_Foo__x) 
      15 LOAD_CONST    0 (None) 
      18 RETURN_VALUE   
>>> 

Как вы можете заметить, код bar.__x был составлен так, как будто это было bar._Foo__x. Это происходит независимо от типа bar при вызове этого кода. В этом случае переключение имени происходит даже при доступе к членам глобального.

Обратите внимание, что если вы обнаружите, что используете многое имя, возможно, вы делаете что-то неправильно. Программист Python может долго жить, не нуждаясь в частных данных.

Это происходит и потому, что в Python вывода не требуется так часто, как и в других языках, благодаря делегации и утиной типизации ...

+0

спасибо! Теперь я знаю, почему, компилятор будет называть вас ручным именем текущего класса, независимо от того, кем бы вы ни были. Еще раз спасибо! ясно объяснено. –

1

Если использовать двойные подчеркивания, чтобы использовать имя коверкая, вы можете только ссылаться на эту переменную в методах по этому классу. В любое время вы пишете

obj.__var 

внутри метода класса, Python заменит его

obj.__ClassName_var 

Где ClassName это имя класса для этого метода.

+0

Спасибо, человек! теперь я знаю, почему! –

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

  • Нет связанных вопросов^_^