簡體   English   中英

從類中派生的屬性命名約定,將來可能會更改

[英]Attribute naming convention when deriving from class that may change in the future

我的問題很籠統,但為清楚起見,我想舉一個盡可能具體的例子:我最近正在寫一門課程,該課程源於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 (我選擇的解決方案)。 但是,據我了解,應該盡量少使用名稱修飾,如果我有很多私有屬性,則代碼中會有很多雙下划線。

所以這里有個問題:從我自己的控件派生而來的類(將來可能會改變)時,是否有一種命名私有類屬性的首選方法?

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

實在很難告訴您應該如何在代碼中選擇標識符的名稱,這對您是開放的。 一般來說,避免名稱沖突是您作為程序員的工作,某些高級IDE可以幫助完成此過程。

對於您的問題,我相信使用名稱修飾絕對可以避免名稱沖突,這不會使您的代碼帶有下划線,因為您明智地使用了此功能,您可能會認為。 如果您使用大量冗余名稱,則最好選擇唯一名稱。 通常,可以使用__name表示屬性,以確保它們屬於其類,並且請記住,Python中的private並不是真正的私有,而是真正的偽私有。 您仍然可以訪問這些屬性。

這是避免名稱沖突的一種技巧:

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

因此,如果name已經在類Foo的名稱空間中存在,您會從這一行知道並且要獲取類Foo所有屬性的列表,只需調用dir並將Foo作為其參數: dir(Foo)

主要是設計問題,但是如果我在您的位置,我會選擇與dir進行核對,以確保我的姓名唯一,以避免無意間覆蓋其他名稱。 例如,如果您閱讀Python標准庫的代碼,在許多地方,使用_name命名約定來表示該名稱不應從類外部直接訪問是很明顯的。

暫無
暫無

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

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