2009-01-28 74 views
101

在Python 2.5.2,下面的代碼引發一個類型錯誤:Python的超()提出了類型錯誤

>>> class X: 
... def a(self): 
...  print "a" 
... 
>>> class Y(X): 
... def a(self): 
...  super(Y,self).a() 
...  print "b" 
... 
>>> c = Y() 
>>> c.a() 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
    File "<stdin>", line 3, in a 
TypeError: super() argument 1 must be type, not classobj 

如果我更換class Xclass X(object),它會工作。這是什麼解釋?

+2

你的「但是我用類X(對象)替換類X」修復了我的問題! thanx – AliBZ 2013-05-24 17:35:45

回答

124

原因是super()只對新樣式類進行操作,而在2.x系列中則意味着從對象中擴展。

+3

從什麼python版本這成爲默認行爲? – Geo 2009-01-28 20:51:19

+6

2.2是當新風格的類被引入時,3.0是他們成爲默認類的地方。 – 2009-01-28 20:54:16

13

另外,除非必須,否則不要使用super()。對於您可能會懷疑的新式課程,這不是通用的「正確的事情」。

還有,當你期待多重繼承倍,你有可能會需要它,但直到你知道MRO的毛茸茸的細節,最好不要管它,堅持:

X.a(self) 
1

我試過各種Xa()方法;然而,他們似乎需要X的一個實例來執行(),所以我做了X()。a(self),這似乎比以前的答案更完整,至少對於我遇到的應用程序來說。由於沒有必要的建設和破壞,它似乎不是處理問題的好方法,但它工作正常。

我的具體應用程序是Python的cmd.Cmd模塊,由於某種原因,它顯然不是NewStyle對象。

最終結果:

X().a(self) 
3

如果上述答案提到很清楚。你的父類需要從「對象」繼承,這本質上將它變成一個新的風格類。

# python 3.x: 
class ClassName(object): # This is a new style class 
    pass 

class ClassName: # This is also a new style class (implicit inheritance from object) 
    pass 

# Python 2.x: 
class ClassName(object): # This is a new style class 
    pass 

class ClassName:   # This is a old style class 
    pass 
相關問題