[英]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.