python - सुपर() नई शैली शैली के लिए "टाइप एरर: टाइप होना चाहिए, क्लासोबज नहीं होना चाहिए"




superclass super (4)

आप class TextParser(HTMLParser, object): भी उपयोग कर सकते हैं:। यह TextParser एक नई शैली की कक्षा बनाता है, और super() का उपयोग किया जा सकता है।

super() का निम्नलिखित उपयोग एक टाइपरर उठाता है: क्यों?

>>> from  HTMLParser import HTMLParser
>>> class TextParser(HTMLParser):
...     def __init__(self):
...         super(TextParser, self).__init__()
...         self.all_data = []
...         
>>> TextParser()
(...)
TypeError: must be type, not classobj

स्टैक ओवरव्लो पर एक समान प्रश्न है: पायथन सुपर () टाइपइरर बढ़ाता है , जहां त्रुटि इस तथ्य से समझाई जाती है कि उपयोगकर्ता वर्ग एक नई शैली की कक्षा नहीं है। हालांकि, उपरोक्त वर्ग एक नई शैली की कक्षा है, क्योंकि यह object से विरासत में है:

>>> isinstance(HTMLParser(), object)
True

मैं क्या खो रहा हूँ? मैं super() , यहां कैसे उपयोग कर सकता हूं?

super(TextParser, self).__init__() HTMLParser.__init__(self) बजाय HTMLParser.__init__(self) का उपयोग करना super(TextParser, self).__init__() काम करेगा, लेकिन मैं TypeError को समझना चाहता हूं।

पीएस: जोआचिम ने बताया कि एक नया शैली-वर्ग उदाहरण होने के नाते एक object होने के बराबर नहीं है। मैंने कई बार विपरीत पढ़ा, इसलिए मेरा भ्रम ( object इंस्टेंस टेस्ट के आधार पर नए स्टाइल क्लास इंस्टेंस टेस्ट का उदाहरण: https://stackoverflow.com/revisions/2655651/3 )।


करने का सही तरीका पुरानी शैली के वर्गों में निम्नानुसार होगा जो 'ऑब्जेक्ट' से प्राप्त नहीं होता है

class A:
    def foo(self):
        return "Hi there"

class B(A):
    def foo(self, name):
        return A.foo(self) + name

यदि आप विरासत वृक्ष (संस्करण 2.6 में) देखते हैं, तो HTMLParser SGMLParser से ParserBase होता है जो ParserBase से ParserBase होता है जो object से प्राप्त नहीं होता object । आईई HTMLParser एक पुरानी शैली की कक्षा है।

isinstance में मैंने एक त्वरित परीक्षण किया है:

In [1]: class A:
   ...:     pass
   ...: 

In [2]: isinstance(A, object)
Out[2]: True

यहां तक ​​कि यदि कक्षा पुरानी शैली की कक्षा है, तो यह अभी भी object का एक उदाहरण है।


समस्या यह है कि super को एक object रूप में एक 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 से प्राप्त होना होगा। लेकिन सुनिश्चित करें कि कक्षा एमआरओ में वस्तुएं आखिरी बार आती हैं:

>>> class myclass(oldstyle, object):
...     def __init__(self): super(myclass, self).__init__()

>>> myclass().os
True




typeerror