2013-10-11 64 views
3

也許這是一個愚蠢的問題,但爲什麼這個代碼不能在python 2.7中工作?在python 2.7中擴展類,超級用法()

from ConfigParser import ConfigParser 

class MyParser(ConfigParser): 
    def __init__(self, cpath): 
     super(MyParser, self).__init__() 
     self.configpath = cpath 
     self.read(self.configpath) 

它未能於:

TypeError: must be type, not classobj 
super()

回答

4

很可能是因爲ConfigParser不從object繼承,因此,不是new-style class。這就是爲什麼super在那裏不起作用。

檢查ConfigParser定義和驗證,如果是這樣的:

class ConfigParser(object): # or inherit from some class who inherit from object 

如果沒有,這就是問題所在。

我對您的代碼的建議不是使用super。只需調用上ConfigParser這樣直接的自我:

class MyParser(ConfigParser): 
    def __init__(self, cpath): 
     ConfigParser.__init__(self) 
     self.configpath = cpath 
     self.read(self.configpath) 
+2

如果您查看ConfigParser.py(2.7.4)的源代碼,ConfigParser繼承自RawConfigParser,它是一箇舊式類(不會從'object'繼承)。 – cpburnz

+0

你走了。這就是原因。 –

3

的問題是,ConfigParser舊式類。 super不適用於舊式課程。相反,使用顯式調用__init__

def __init__(self, cpath): 
    ConfigParser.__init__(self) 
    self.configpath = cpath 
    self.read(self.configpath) 

例如參見this question,,爲新老VS風格類的解釋。

+0

「老式課堂」到底是什麼? – lollercoaster

+0

查看我更新的答案 – shx2