2017-06-02 105 views
0

我的問題是相當普遍的改變類派生的時候,但爲了清楚起見,我想給那就是儘可能具體的例子:我最近寫的一類,其衍生從matplotlib artist。一個最小的工作的例子是以下幾點:屬性命名約定從可能在未來

from matplotlib import text 

class TextChild(text.Text): 
    def __init__(self): 
     self._rotation = self.get_rotation() 

後面使用下劃線self._rotation當時的想法是顯示潛在用戶不能直接訪問該屬性(即把它歸類私人)。這原來是一個不好的主意,因爲text.Text也有一個屬性_rotation,我得到了令人驚訝的結果。

有,當然,方式來處理這個問題。

  • 一種是使用不同的屬性名稱,比方說,self._rotation2,但 基類可能會受到在將來改變,可能 引入新的屬性,並且以位倒黴的名字也許 再配,這會破壞派生類。
  • 另一種解決方案將是使用名字粉碎,即 self.__rotation(I選擇的溶液)。從我的理解,然而 ,名字改編應作爲稀疏地,如果 我有很多私有屬性會有很多雙 代碼強調。

所以,這裏是一個問題:當從我自己的控制中派生出一個類,並且這個類可能會在將來發生變化時,有沒有一種首選私有類屬性的方法?

回答

0

當從我自己的控件中派生出一個可能在將來會改變的類時,是否有一種命名私有類屬性的首選方法?

確實很難說出如何在代碼中選擇標識符的名稱,這對您是開放的。一般來說,這是您作爲程序員避免名稱衝突的工作,一些高級IDE可以在此過程中提供幫助。

對於你的問題我相信使用名稱重整肯定會避免名稱衝突在某種程度上,這會不會垃圾你的代碼用下劃線,你可能會認爲因爲你明智地使用此功能。如果您使用了大量冗餘名稱,最好選擇唯一的名稱。通常可以使用__name來確定屬性是否屬於他們的類,請記住Python中的private不是真正的私有屬性,它實際上是僞私有屬性。您仍然可以訪問這些屬性。

這裏有一個技巧,你可以用它來避免名稱衝突:

>>> "name" in dir(Foo) 
True 

所以,如果name已經存在於Foo類的命名空間,你會知道,從這個單一的線和獲得列表Foo類的所有屬性只需要調用dirFoo作爲它的參數:dir(Foo)

主要是這是一個設計問題,但如果我處於您的位置,我會選擇使用dir來確保我的名字的唯一性,以避免無意中覆蓋其他名稱。例如,如果你閱讀Python標準庫的代碼,很多地方使用_name命名約定來表示這個名字不應該從外部直接訪問這個類是非常明顯的。