亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

對于新樣式的類,super()引發“ TypeError:必須是類型,而不是classobj”

對于新樣式的類,super()引發“ TypeError:必須是類型,而不是classobj”

catspeake 2019-10-23 16:09:57
以下用法super()引發TypeError:為什么?>>> from  HTMLParser import HTMLParser>>> class TextParser(HTMLParser):...     def __init__(self):...         super(TextParser, self).__init__()...         self.all_data = []...         >>> TextParser()(...)TypeError: must be type, not classobj在StackOverflow上有一個類似的問題:Python super()引發TypeError,該錯誤由用戶類不是新型類的事實來解釋。但是,上面的類是一種新式的類,因為它繼承自object:>>> isinstance(HTMLParser(), object)True我想念什么?我如何super()在這里使用?使用HTMLParser.__init__(self)代替super(TextParser, self).__init__()可以工作,但是我想了解TypeError。PS:Joachim指出,成為一個新類實例并不等同于成為一個實例object。我讀了很多相反的書,因此感到困惑(基于object實例測試的新型類實例測試的示例:https : //stackoverflow.com/revisions/2655651/3)。
查看完整描述

3 回答

?
慕斯709654

TA貢獻1840條經驗 獲得超5個贊

super()僅可用于新型類,這意味著根類需要從'object'類繼承。


例如,頂級類需要像這樣:


class SomeClass(object):

    def __init__(self):

        ....


class SomeClass():

    def __init__(self):

        ....

因此,解決方案是直接調用父級的init方法,如下所示:


class TextParser(HTMLParser):

    def __init__(self):

        HTMLParser.__init__(self)

        self.all_data = []


查看完整回答
反對 回復 2019-10-23
?
郎朗坤

TA貢獻1921條經驗 獲得超9個贊

問題是super需要object一個祖先:


>>> class oldstyle:

...     def __init__(self): self.os = True


>>> class myclass(oldstyle):

...     def __init__(self): super(myclass, self).__init__()


>>> myclass()

TypeError: must be type, not classobj

經過仔細檢查,發現:


>>> type(myclass)

classobj

但:


>>> class newstyle(object): pass


>>> type(newstyle)

type    

因此,解決問題的方法是從對象以及HTMLParser繼承。但是確保對象在MRO類中排在最后:


>>> class myclass(oldstyle, object):

...     def __init__(self): super(myclass, self).__init__()


>>> myclass().os

True


查看完整回答
反對 回復 2019-10-23
  • 3 回答
  • 0 關注
  • 325 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號