2012-03-15 18 views
40

किसी कारण से, super() विधि हमेशा आशा अनुरूप बर्ताव कर रही है नहीं, वापस जाने के लिए चुनने:अजगर सुपर() व्यवहार भरोसेमंद नहीं

TypeError('super(type, obj): obj must be an instance or subtype of type)' 

मैं समझता हूँ कि क्या त्रुटि मतलब है। मुझे समझ में नहीं आता कि यह एक त्रुटि के रूप में क्यों आ रहा है। तोड़ने वाले कोड का स्निपेट यहां दिया गया है। सिस्टम में सभी ऑब्जेक्ट्स नई स्टाइल ऑब्जेक्ट्स हैं।

वास्तव में दिलचस्प क्या है कि यह त्रुटि हमेशा दिखाई नहीं देती है। मुझे नहीं पता कि इसका क्या कारण है। Retrieval में super() विधि, एक वस्तु है, जो है, जहाँ तक मुझे पता है कर रहा हूँ के रूप में Retrieval वर्ग गुजर रहा है, और उसके बाद ही वास्तव में कैसे super() है चाहिए लागू किया जा करने के लिए।

कोई विचार बिल्कुल?

फ़ाइल DBConnection.py में:

class DBAdminConnection(object): 
    def __init__(self): 
     self.user = DBUserConnection().user 
     self.submissions = DBSubmissionConnection() 

फ़ाइल में Retrieval.py

class Retrieval(DBConnection.DBAdminConnection): 
    def __init__(self, username=None, password=None, unique_key=None): 
     super(Retrieval,self).__init__() 
     if username and password: 
      self.username = username 
      self.user.login(username,password, config.DATABASE) 
      if self.user.error: 
       raise UserLoginError(username) 
     self.unique_key = unique_key 

उत्तर

57

आप चीजों के बीच में किसी भी तरह मॉड्यूल को फिर से लोड कर रहे हैं? यदि ऐसा है, तो यह त्रुटि समझा सकता है।

isinstance(self,DBAdminConnection) स्मृति संदर्भों में परिवर्तनों के कारण मॉड्यूल को पुनः लोड करने के बाद झूठा हो सकता है।

संपादित करें: आप mod_wsgi के तहत अपने web.py एप्लिकेशन चला रहे हैं, सुनिश्चित करें कि आप अक्षम कर रहे हैं autoreload बनाने:

app = web.application(urls, globals(), autoreload=False) 
+0

वेबपी के माध्यम से चल रहा है। तो यह एक निश्चित संभावना है। खासकर जब से मैं ऐप इंस्टेंस को मारता हूं और इसे राहत देता हूं, तो समस्या दूर हो जाती है। वाह। अब सवाल यह है कि कैसे इसे ठीक करने के लिए बिल्ली। –

+0

@TomThorogood: आप अपना ऐप कैसे चला रहे हैं? क्या आप mod_wsgi का उपयोग कर रहे हैं? –

+0

@TomThorogood: अगर आप wsgi का उपयोग कर रहे हैं तो कुछ जोड़ा। –

1

मुझे यकीन है कि क्यों त्रुटि हो रहा है नहीं कर रहा हूँ, लेकिन करने के लिए एक सहायता के रूप डिबगिंग आप super पर try/except ब्लॉक में कॉल को लपेट सकते हैं और अपवाद उठाए जाने पर डेटा डंप कर सकते हैं। कुछ इस तरह:

class Retrieval(DBConnection.DBAdminConnection): 
    def __init__(self, username=None, password=None, unique_key=None): 
     try: 
      super(Retrieval,self).__init__() 
     except TypeError, e: 
      print "Failure initialising Retrieval --> self: %r" 
      raise 
     if username and password: 
      self.username = username 
      self.user.login(username,password, config.DATABASE) 
      if self.user.error: 
       raise UserLoginError(username) 
     self.unique_key = unique_key 
+0

क्या आपका मतलब था कि आप निश्चित नहीं हैं? क्योंकि आपको एक पल के लिए मेरी आशा मिल गई है।/grin –

+0

@TomThorogood: एएके! हाँ, मेरा मतलब था 'यकीन नहीं' - क्षमा करें! –

+0

हाहा। कोई चिंता नहीं! चीज़ के लिए धन्यवाद। मेरे पास कुछ डिबगिंग है; मैं बस एसओ के लिए कोड साफ कर रहा था। –

11

आप अपने कार्यप्रवाह के भाग के रूप पुनः लोड() का उपयोग कर रहे हैं, तो आप जाहिरा तौर पर भी विरासत आरंभीकरण के लिए super(self.__class__, self).__init__ उपयोग करने के लिए की जरूरत है।

मुझे संदेह है कि आपको यह बग id(self.__class__) ==id(Retrieval) विफल होने के साथ मिल जाएगा।

+8

'सुपर (स्वयं .__ वर्ग__, स्वयं) 'हमेशा गलत है। यदि आप आगे बढ़ते हैं तो यह एक अनंत लूप बन जाएगा। – Blckknght

+1

यदि आप किसी भी आगे उपclass नहीं करते हैं, तो क्या कभी-कभी ठीक है? – cce

1

मुझे बस एक ही समस्या थी, जो जुपीटर नोटबुक में अपना कोड चला रहा था। मैं पुनः लोड का उपयोग कर रहा था, इसलिए मैंने अपने कर्नेल को एडवार्डो इवेनेक की प्रतिक्रिया पर अनुवर्ती करने के लिए पुनरारंभ किया और यह देखने के लिए कि क्या यह समस्या थी। तब मेरा कोड टूट गया। मैंने पाया कि मेरी समस्या विरासत की कई परतों से संबंधित थी, जहां नीचे परत को मॉड्यूल में दूसरी तल परत से परिभाषित किया गया था।

class MyClass1(object): 
'''example class 1''' 

class MyClass2(MyClass1): 
'''example class 2''' 
    def __init__(self): 
    super(MyClass2, self).__init__() 

class MyClass4(MyClass3): 
'''example class 4 - no __init__ definition''' 

class MyClass3(MyClass2): 
'''example class 3 - no __init__ definition''' 

जब मैं MyClass3 नीचे MyClass4 ले जाया गया है, यह समस्या ठीक हो गई।

यह शायद एक डरावनी गलती है, इसलिए शायद यह ऊपर की मूल समस्या का कारण हल नहीं करेगा, लेकिन मैंने सोचा कि अगर मैं वहाँ अन्य रूकी हैं, तो मेरे जैसे पोस्ट, मैं एक ही गलती कर रहा हूं ।

1

मैं एक ही त्रुटि तो था मैं देखा है कि मैं एक ही फाइल में डुप्लिकेट वर्ग (मेरी गलती) था (क्षमा याचना करता है, तो मेरी शैली गलत है, इस स्टैक ओवरफ़्लो। :) पर मेरी पहली पोस्ट है)। py। त्रुटि तब गायब हो गई जब मैंने दूसरे श्रेणी ए को कक्षा बी

#Just some example below, not real code 
class A (object): 

    def fun(self): 
     super(A, self).fun() 

class A (object): ##This second class with same name (A) caused the error 

    def some_fun(self,x,y): 
+0

यह मेरे लिए तय है, धन्यवाद! – Ghan

संबंधित मुद्दे