2016-04-29 6 views
2

Ich bin neu in Python lernen über Namen Mangling (Doppelunterstrich), ich habe meine Suche gemacht und gelernt, aber ich habe eine Frage und konnte nicht die Antwort durch die Suche bekommen: Wir brauchen nicht Namen Mangling im Umgang mit einem anderen Objekt der gleichen Klasse in einer Klassenfunktion, oder? siehe mein Testcode:keine Notwendigkeit für Namen Mangling für ein anderes Objekt der gleichen Klasse in 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

Was ist der Zweck der 'Klasse Point1'? –

+0

"Benötigen Sie keinen Namen Mangling" für welchen Zweck? – TigerhawkT3

Antwort

2

Namen Mangeln Arbeiten bei Kompilierung und ersetzt den Namen jedes Attribut mit zwei Unterstrichen mit der verstümmelten Version zu starten.

Beachten Sie Folgendes:

>>> 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   
>>> 

Wie Sie den Code für bar.__x feststellen kann kompiliert wurde, als ob es bar._Foo__x war. Dies geschieht unabhängig vom Typ bar beim Aufruf dieses Codes. In diesem Fall erfolgt die Namensänderung auch beim Zugriff auf globale Member.

Beachten Sie, dass wenn Sie sich oft mit Namen mangeln, dann machen Sie wahrscheinlich etwas falsch. Ein Python-Programmierer kann eine ganze Weile glücklich leben, ohne jemals private Datenmitglieder zu benötigen.

Dies geschieht auch, weil in Python Ableitung benötigt wird, nicht so häufig wie in anderen Sprachen dank Delegation und Ente eingeben ...

+0

danke !! Jetzt weiß ich, warum, Compiler wird Sie mit dem aktuellen Klassennamen nennen, egal wer auch immer Sie waren. Danke noch einmal! klar erklärt. –

1

Wenn Sie doppelt Unterstrichen verwenden Namen Mangeln zu verwenden, können Sie nur diese Variable in Methoden auf die Klasse verweisen können. Immer, wenn Sie schreiben

obj.__var 

innerhalb einer Klassenmethode wird Python ersetzen Sie es mit

obj.__ClassName_var 

Wo ClassName ist der Name der Klasse für diese Methode.

+0

Danke Mann! jetzt weiß ich warum! –

Verwandte Themen