2

可能重複屬性:
What is the benefit of private name mangling in Python?意義和使用實例/類領先的雙下劃線(特殊行爲)

當我和蟒蛇玩,我發現,如果classinstance變量名以2個下劃線開始,它們將被重命名以便以'_'開頭。

class Test(object): 
    __attribute = "dunderscored" 
    def __init__(self, value=0): 
     self.__instance_attribute = value 


test_instance = Test() 

那麼這兩個變量將被重新命名爲

test_instance._Test__attributetest_instance._Test__instance_attribute

爲什麼會出現這樣的行爲/功能?這是否有任何需要,或者是否有任何特殊用途?

我可以想到一個用例,當不同的類有一個屬性與通用名稱,例如。值,ID,成員是共同的,但對於某些函數/方法,我們期待/假定只有這些類中的一個。在這種情況下,有可能類型檢查沒有完成,並且另一個類實例被傳遞給它(可能是錯誤的)可能會導致錯誤和/或不良行爲。

但除了這個用例,我沒有看到這種特殊行爲的任何好處。行爲看起來像一個功能,非常基本,我覺得我在這裏失去了一些東西。如果這是一個功能它有什麼用處?任何典型的用例?

回答

3

使用前綴雙下劃線的被稱爲名稱重整:(來自Python docs):

形式__spam的任何標識符(至少兩個前導下劃線,至多一個結尾下劃線)的文本上與_classname__spam替換,其中classname是當前類名,前導下劃線被剝離。這種修改不考慮標識符的語法位置,所以它可以用來定義類 - 私有實例和類變量,方法,存儲在全局變量中的變量,甚至是存儲在實例中的變量。這個類在其他類的實例上是私有的。

注意單下劃線前綴用於指示變量/函數/類應該是私有的(雖然不是嚴格執行)

1

此功能是爲了幫助避免名稱衝突與屬性時子類。

考慮以下幾點:

class MyClass1(object): 
    def __init__(self): 
     self.__attribute = 3 

    def doSomething(self): 
     print(self.__attribute) 

class MyClass2(MyClass1): 
    def __init__(self): 
     MyClass1.__init__(self) 
     self.__attribute = 4 

    def doSomething2(self): 
     print(self.__attribute) 

現在,如果你創建一個實例:

x = MyClass2() 
x.doSomething() #prints 3 
x.doSomething2() #prints 4 

這基本上可以用來從行爲分離出一些父類(MyClass)的行爲(MyClass2

+0

我沒有在這裏看到子類(除了'object')... – glglgl

+0

@glglgl - 德哦 - 謝謝。固定。 – mgilson

相關問題