software - python tutorial




सुपर() त्रुटि के साथ विफल रहता है: TypeError "तर्क 1 टाइप होना चाहिए, classobj नहीं" (3)

मुझे कुछ त्रुटि मिलती है जिसे मैं समझ नहीं सकता। कोई भी संकेत मेरे नमूना कोड के साथ क्या गलत है?

class B:
    def meth(self, arg):
        print arg

class C(B):
    def meth(self, arg):
        super(C, self).meth(arg)

print C().meth(1)

मुझे 'सुपर' अंतर्निर्मित विधि की सहायता से नमूना परीक्षण कोड मिला। कक्षा "सी" है

यहां त्रुटि है:

Traceback (most recent call last):
  File "./test.py", line 10, in ?
    print C().meth(1)
  File "./test.py", line 8, in meth
    super(C, self).meth(arg)
TypeError: super() argument 1 must be type, not classobj

एफवाईआई, यहां पाइथन से मदद (सुपर) है:

Help on class super in module __builtin__:

class super(object)
 |  super(type) -> unbound super object
 |  super(type, obj) -> bound super object; requires isinstance(obj, type)
 |  super(type, type2) -> bound super object; requires issubclass(type2, type)
 |  Typical use to call a cooperative superclass method:
 |  class C(B):
 |      def meth(self, arg):
 |          super(C, self).meth(arg)
 |

आपकी समस्या यह है कि कक्षा बी को "नई शैली" श्रेणी के रूप में घोषित नहीं किया गया है। इसे इस तरह बदलें:

class B(object):

और यह काम करेगा।

super() और सभी सबक्लास / सुपरक्लास सामान केवल नई शैली के वर्गों के साथ काम करता है। मैं आपको यह सुनिश्चित करने के लिए कि यह एक नई शैली की कक्षा है, किसी भी कक्षा परिभाषा पर हमेशा (object) टाइप करने की आदत प्राप्त करने की अनुशंसा करता हूं।

पुरानी शैली के वर्ग (जिसे "क्लासिक" कक्षाओं के नाम से भी जाना जाता है) हमेशा classobj के प्रकार classobj ; नई शैली के वर्ग प्रकार के type । यही कारण है कि आपको त्रुटि संदेश मिला है:

TypeError: super() argument 1 must be type, not classobj

अपने लिए देखने के लिए इसे आजमाएं:

class OldStyle:
    pass

class NewStyle(object):
    pass

print type(OldStyle)  # prints: <type 'classobj'>

print type(NewStyle) # prints <type 'type'>

ध्यान दें कि पायथन 3.x में, सभी वर्ग नई शैली हैं। आप अभी भी पुरानी शैली के वर्गों से वाक्यविन्यास का उपयोग कर सकते हैं लेकिन आपको एक नई शैली की कक्षा मिलती है। तो, पायथन 3.x में आपको यह समस्या नहीं होगी।


जब मैंने पायथन 2.7 का इस्तेमाल किया तो मुझे पोस्ट किए गए मुद्दे का भी सामना करना पड़ा। यह पाइथन 3.4 के साथ बहुत अच्छा काम कर रहा है

इसे पायथन 2.7 में काम करने के लिए मैंने अपने प्रोग्राम के शीर्ष पर __metaclass__ = type विशेषता जोड़ा है और यह काम करता है।

__metaclass__ : यह पुरानी शैली के वर्गों और नई शैली के वर्गों से संक्रमण को आसान बनाता है।


साथ ही, यदि आप कक्षा बी नहीं बदल सकते हैं, तो आप एकाधिक विरासत का उपयोग करके त्रुटि को ठीक कर सकते हैं।

class B:
    def meth(self, arg):
        print arg

class C(B, object):
    def meth(self, arg):
        super(C, self).meth(arg)

print C().meth(1)






python