2017-09-03 24 views
-2

我已閱讀所有關於此主題的類似帖子,但沒有發現與我的問題有關的方式,這有助於我弄清楚發生了什麼。'super'對象沒有屬性'_Parent__method'

class A: 
    def __init__(self, value): 
     self.__value = value 
     self.__conn = httpsconnection # Specifics don't matter 

class B(A): 
    def __init__(self, id, type, value): 
     super().__init__(value) 
     self.data = self.__create_sub_class(id, type) 

    def __create_sub_class(self, id, type): 
     self.__conn.request(...) 
     ... 
     return data 

class C(B): 
    def __init__(self, id, value): 
     super().__init__(id, externalVariable, value) 

我得到的錯誤是AttributeError: 'C' object has no attribute '_B__conn'

不該類C繼承B它繼承了它從A變量?

+2

爲什麼使用雙下劃線名稱?這些都是明確設計的,以避免可繼承性。 –

+0

https://docs.python.org/3/tutorial/classes.html#private-variables – NPE

+0

@MartijnPieters它們是我的私有變量。我在學習編程時習慣用另一種語言。 – Spedwards

回答

1

如果要在子類中使用這些名稱,請勿使用前導雙下劃線名稱。 __name明確地被設計爲使名稱類私人,即只對確切的類有用。這個想法是,你可以在框架中使用這些名稱,而不必限制子類可以使用的名稱。

這樣的名字是在編譯的時候受到損壞;他們有_ClassName前綴(與當前類名稱)。如果你想以通知的名稱是內部簡單地用單下劃線的名稱(Python有沒有實際私密模式,名稱是始終可以訪問):

class A: 
    def __init__(self, value): 
     self._value = value 
     self._conn = httpsconnection # Specifics don't matter 

class B(A): 
    def __init__(self, id, type, value): 
     super().__init__(value) 
     self.data = self._create_sub_class(id, type) 

    def _create_sub_class(self, id, type): 
     self._conn.request(...) 
     ... 
     return data 

Reserved classes of identifiers詞法分析文檔中:

__*
類私有名稱。如果在類定義的上下文中使用此類別中的名稱,則會重新編寫該名稱以使用損壞的表格來避免名稱與派生類的「私有」屬性之間的衝突。

和引用documentation on names

私人名稱重整:當該文本方式發生在類定義的標識符具有兩個開始或多個下劃線字符,並在兩個或多個下劃線並沒有結束,它被認爲是該類的私人名稱。在爲其生成代碼之前,專用名稱會轉換爲更長的形式。該轉換將在名稱前插入類名,並刪除前導下劃線和插入的單個下劃線。例如,在名爲Ham的類中出現的標識符__spam將被轉換爲_Ham__spam。這種轉換獨立於使用標識符的語法上下文。

+0

謝謝。我不知道整個名字 - 破壞。我不知道爲什麼,但我一直傾向於使用雙下劃線。我想現在不得不改變。 – Spedwards