2012-12-03 89 views
6

讀取Django源代碼我遇到了this函數。這是block標籤的實施。爲什麼要在類的外部設置「private」python屬性?

我感興趣的是,他們從設置變量有兩個領先的下劃線(__loaded_blocks)外parser類實例(解析器是Parser class的一個實例)。 Django源代碼中的快速grep顯示字符串loaded_blocks僅在此出現。

現在,我從來沒有考慮過這個使用前蟒蛇名稱壓延功能,但是這實際上將隱藏parser__loaded_blocks屬性從本身!要從parser方法中讀取此屬性,您必須求助於getattr(self, "__loaded_blocks")

我是否正確地認爲這只是所選屬性名稱的意外和未使用的副作用?還是有更深的目的呢?

一般來說,你爲什麼想要做這樣的事情?

編輯:要澄清,我充分認識到,只要你不要試圖從parser的方法訪問__loaded_blocks屬性,它的工作就像任何其他的屬性,它是其實不是一個mangled屬性。

+2

沒有目的的消費者,Django的只是有醜陋的代碼。 – Keith

回答

3

我不覺得當你與__前綴屬性上增添一個實例

名稱重整將發生docs

私人名字改編:當該文本上出現在標識符一個 類定義以兩個或多個下劃線字符開頭,並且 不會以兩個或更多下劃線結尾,因此它被認爲是該類的一個私有名稱 。在爲其生成代碼之前,專用名稱將轉換爲更長的形式 。該轉換將名稱前面的 類名插入,刪除了前導下劃線,並且在類名前插入了一個下劃線。例如, 在一個名爲Ham的類中出現的標識符__spam將被變換爲Ham _spam。這種轉換獨立於使用標識符的語法上下文 。如果 轉換後的名稱非常長(超過255個字符),則可能會發生 實現定義的截斷。如果類名 只包含下劃線,則不進行轉換。

class Test: 
    pass 

test = Test() 
test.__hello = 'hii'  
test.__hello # hiii 

雖然名字不缺胳膊少腿它仍然標誌着這是「私人」的代碼

+0

哦,我意識到這一點。但是如果你在'Test'中創建了一個方法,它在設置後打印了__hello屬性,它將無法執行,因爲它實際上會嘗試打印'_Test__hello'屬性。正如我所說的,這種方法必須使用getattr來打印外部設置的__hello屬性。 –

+0

@lazyr oo是的,我明白你現在說的話!他們沒有閱讀它的方法,如果他們確實打賭他們不會創建一個雙下劃線的變量... – dm03514

相關問題