2010-08-16 94 views
2

我想知道如何通過子類對象訪問超類的變量如果有任何意義,我補充說一些變量是以這種__variable名稱的方式定義的。任何時候我想用一個子對象訪問變量。 Python說這裏的類型爲CHILE CLASS TYPE的對象沒有定義。我想知道我該如何解決這個問題? 我也想補充說,超類沒有明確定義,它只是從模塊導入。如何通過Python中的子類的實例訪問基類變量?

class AcuExcelSheet ( Worksheet ): ## super class which is imported from module 
    def __init__(self): 
     Worksheet.__init__(self) 

sheet = AcuExcelSheet() 
for row_index in range(sheet.nrows): 
     for col_index in range(sheet.ncols): 
      print sheet.cell(row_index,col_index).value 

有效範圍內的ROW_INDEX(sheet.nrows): AttributeError的: 'AcuExcelSheet' 對象有沒有屬性 'NROWS'

我想知道關於這個類變量調用的語法。因爲我可以看到屬性nrow已經在Worksheet類的構造函數中定義。

+2

也許你可以使用工作表實例上的dir()來查看它的屬性? – unwind 2010-08-16 14:21:49

+0

您使用的是xlrd還是xlwt? – 2010-08-16 15:07:13

+0

請發佈一個簡單的例子,顯示你不明白的東西。作爲獎勵,我敢打賭,製作簡單例子的行爲會告訴你什麼是錯的。您當前的示例太不完整,無法告訴您任何有用的信息。這是一個很糟糕的問題。 – Omnifarious 2010-08-16 17:30:06

回答

2

請原諒我,如果我誤解了某些東西,但是子類沒有自動繼承超類的方法嗎?例如看到這一點:

>>> class A(object): 
...  def __init__(self): 
...    self.data = "GIMME TEH DATA" 
... 
>>> a = A() 
>>> a.data 
'GIMME TEH DATA' 
>>> class B(A): 
...  pass 
... 
>>> b = B() 
>>> b.data 
'GIMME TEH DATA' 

所以超A的初始化方法設置data屬性。 B是子類,並且B的一個實例自動初始化了相同的data屬性。

我的意思從這個說的是,這部分似乎完全沒有必要對我說:

def __init__(self): 
    Worksheet.__init__(self) 

(至於其他的我與你需要要麼使用內省或者找到文檔的評論者同意找出哪些屬性Worksheet有 - 沿

>>> a = Worksheet() 
>>> print dir(a) 

東西線)

4

東西是不對的,但不能用。你顯示的代碼。如果Worksheet確實定義了.nrows,那麼您的AcuExcelSheet將有權訪問它。有幾種可能性:

  1. Worksheet沒有定義nrows。你提到雙下劃線的名字。你確定它不是__nrows
  2. Worksheet定義了nrows,但僅限於某些代碼路徑,並且您構造函數的調用不會觸及這些代碼路徑。
+0

雙下劃線前綴將通過向其添加類名稱來破壞名稱,例如, 'AcuExcelSheet'中的'__nrows'會變成'_AcuExcelSheet__nrows' http://docs.python.org/tutorial/classes.html#private-variables – 2010-08-16 15:04:08

0

對象實例中沒有分離的基類實例字典。 As line

Worksheet.__init__(self) 

表示AcuExcelSheet的對象由Worksheet類初始化。所有可能你需要 - 訪問基類的方法,這是重新定義,你可以通過

super(AcuExcelSheet,self).method_name 

表達做到這一點。所以如果你在子類實例中找不到一些屬性,可能需要一些額外的初始化。

相關問題