2013-07-17 158 views
2

任何人都可以用正確的語法來幫助我從父類中調用我的方法__get_except_lines(...)嗎?在Python中調用父類的方法

我有一個類的方法如下所示。這個特殊的方法有2個下劃線,因爲我不想讓「用戶」使用它。

NewPdb(object) 
    myvar = ... 
    ... 
    def __init__(self): 
     ... 
    def __get_except_lines(self,...): 
     ... 

在一個單獨的文件中,我有另一個繼承自這個類的類。

from new_pdb import NewPdb 

    PdbLig(NewPdb): 
     def __init__(self): 
      .... 
      self.cont = NewPdb.myvar 
      self.cont2 = NewPdb.__get_except_lines(...) 

而且我得到真正讓我困惑的一個屬性錯誤:

AttributeError: type object 'NewPdb' has no attribute '_PdbLig__get_except_lines' 
+0

是否從NewPdb導入__get_except_lines(...)工作? – debianplebian

+0

現在,由於@hivert,問題已解決。我真的很感謝大家在這裏的幫助,我又學到了一些新的東西(名字不斷變化)!偉大的社區! – Sebastian

回答

0
super(<your_class_name>, self).<method_name>(args) 

例如

super(PdbLig, self).__get_except_lines(...) 
+0

謝謝,但現在我得到一個'AttributeError:'super'對象沒有屬性'_PdbLig__get_except_lines''。我使用'self.cont = super(NewPdb,self).__ get_except_lines(...' – Sebastian

+0

這是因爲雙下劃線導致[name mangling](http://docs.python.org/release/1.5/tut/node67.html )。如果你想保持你的變量可以訪問,但給它的內部含義,添加一個下劃線 - 這通常被稱爲「內部使用的」指標 –

0

把雙下劃線放在名字前的整個觀點是爲了防止它在子類中被調用。見http://docs.python.org/2/tutorial/classes.html#private-variables-and-class-local-references

如果你想這樣做,那麼不要用雙下劃線(你可以使用一個下劃線)來命名它,或者爲基類上的名字創建一個別名(從而再次擊敗目的) 。

+0

啊,好吧現在有道理。我的意圖是,我有這個方法的父類,該方法只能在其他方法中使用,所以我想我可以做的只是將這個方法複製並粘貼到子類中,儘管它不是「最乾淨」的方式 – Sebastian

+0

@ SebastianRaschka或者只是不使用兩個下劃線 – Marcin

+0

我想讓那些「用戶」有2個下劃線,以知道這是他不打算使用的方法之一 – Sebastian