簡體   English   中英

Python:帶有雙下划線的類

[英]Python: class with double underscore

我正在跟蹤此鏈接,並嘗試使用Metaclass創建單例類。 但是,我想對此單例類進行一些內部調整,並希望用戶使用另一個類(我們稱其為MySingleton(__Singleton) )。 因此,我決定將其設為私有,但出現以下錯誤。

在此處輸入圖片說明

我唯一的目的是防止__Singleton在室外使用。 我該如何實現?

另外,在類中使用雙下划線是否是一個好習慣?

在類內部,標識符__Singleton受到損壞 您最終會遇到問題,因為名稱修改僅發生在類內部(而不是外部)。 因此,當您在類套件中時, __Singleton作為類名意味着與__Singleton不同。

形式為__spam任何標識符(至少兩個前導下划線,至多一個下划線)在文本上被_classname__spam替換,其中classname是當前的類名,其中前導下划線被去除。 只要不存在標識符的語法位置,就可以進行這種改寫,只要它出現在類的定義內即可。

請注意,進行修改的主要原因是因為它

...對於讓子類覆蓋方法而不中斷類內方法調用很有幫助。

也:

...以避免名稱與子類定義的名稱發生名稱沖突

這樣,實際上沒有任何理由要在類中使用名稱前導雙下划線的類(類內方法調用不會與類名沖突)。 單個下划線就足以向用戶表明他們不應使用該類:

...帶有下划線的名稱(例如_spam )應被視為API的非公開部分(無論是函數,方法還是數據成員)。 它應被視為實現細節,如有更改,恕不另行通知。


我不建議這樣做,但是如果您真的希望它能正常工作,則可以使用globals來查找該類:

class __Foo(object):
    def __init__(self):
        super(globals()['__Foo'], self).__init__()

f = __Foo()
print f

在類定義中帶有兩個下划線的每個名稱都_Singleton__Singleton ,因此__Singleton變為_Singleton__Singleton 為了明確起見,不應將某個類公開使用一個下划線。

Python沒有私有變量 它們都可以從外部訪問。

Python中不存在只能從對象內部訪問的“私有”實例變量。 但是,大多數Python代碼遵循一個約定:以下划線開頭的名稱(例如_spam)應被視為API的非公開部分(無論是函數,方法還是數據成員) 。 它應被視為實現細節,如有更改,恕不另行通知。

Python Cookbook提供了Singleton類 ,其他類可以繼承該類成為Singletons。

暫無
暫無

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

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