[英]no need of name mangling for another object of the same class in python?
我是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))
名稱重整在編譯時起作用,並使用被重整的版本替換以兩個下划線開頭的任何屬性的名稱。
考慮以下:
>>> 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._Foo__x
, bar.__x
的代碼已被編譯為bar._Foo__x
。 無論調用該代碼時bar
的類型如何,都會發生這種情況。 在這種情況下,即使在訪問全局成員時也會發生名稱重整。
請注意,如果您發現自己經常使用名稱修飾,那么可能是您做錯了。 Python程序員可以幸福地生活很長時間,而無需私有數據成員。
發生這種情況也是因為在Python中,由於委托和鴨子輸入,所以不需要像其他語言那樣頻繁地派生...
如果使用雙下划線使用名稱修飾,則只能在該類的方法中引用該變量。 每當你寫
obj.__var
在類方法中,Python會將其替換為
obj.__ClassName_var
其中ClassName
是該方法的類的名稱。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.