簡體   English   中英

不需要在python中對同一個類的另一個對象進行名稱修改?

[英]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__xbar.__x的代碼已被編譯為bar._Foo__x 無論調用該代碼時bar的類型如何,都會發生這種情況。 在這種情況下,即使在訪問全局成員時也會發生名稱重整。

請注意,如果您發現自己經常使用名稱修飾,那么可能是您做錯了。 Python程序員可以幸福地生活很長時間,而無需私有數據成員。

發生這種情況也是因為在Python中,由於委托和鴨子輸入,所以不需要像其他語言那樣頻繁地派生...

如果使用雙下划線使用名稱修飾,則只能在該類的方法中引用該變量。 每當你寫

obj.__var

在類方法中,Python會將其替換為

obj.__ClassName_var

其中ClassName是該方法的類的名稱。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM