2009-10-29 11 views
5

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

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

जैसे, इस स्निपेट का प्रयास करें:

>>> class A: 
...  def greet(self): 
...   print "A says hi" 
... 
>>> class B(A): 
...  def greet(self): 
...   print "B says hi" 
... 
>>> super(B, B()).greet() 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
TypeError: super() argument 1 must be type, not classobj 

मैं सिर्फ उत्सुक क्या हुआ अगर मैं बी बढ़ा हुआ होता था ऑब्जेक्ट से और इसे एक नई स्टाइल क्लास बनाने के लिए, और यह सुपर() काम करना प्रतीत होता था।

>>> class B(A, object): 
...  def greet(self): 
...   print "B says hi" 
... 
>>> super(B, B()).greet() 
A says hi 

क्या यह एक उचित कामकाज है या क्या मेरे पास कुछ अवांछित परिणाम होंगे?

+2

आप 'कक्षा ए' को' कक्षा ए (ऑब्जेक्ट) 'में क्यों नहीं बदल सकते हैं? मूल कारण को ठीक करने और सबकुछ नई शैली बनाने से आपको क्या रोक रहा है? आपको लगता है कि काम के आसपास एक फिक्स से बेहतर क्यों है? –

+1

कारण यह है कि कक्षा ए उत्पन्न होता है (जैसा कि मैंने शुरुआत में उल्लेख किया है, मैं उपकरण उत्पन्न कक्षाओं का विस्तार कर रहा हूं)। अगर मैं यह परिवर्तन करता हूं, अगली बार जब मैं कक्षाओं को पुन: उत्पन्न करता हूं, तो वे ओवरराइट हो जाते हैं। – haridsv

उत्तर

1

आप जनरेटर बदल नहीं सकते तो नई शैली कक्षाओं उत्पन्न करने के लिए, आपके द्वारा पोस्ट की प्रक्रिया कर सकता है फ़ाइल उन्हें नई शैली बनाने के लिए:

import re 
pat = re.compile("^(.*class\s+\w+)(:.*)$") 
out_file = open("edited_file.py", "w") 
for line in open("generated_file.py"): 
    m = pat.match(line) 
    if m: 
     line = m.group(1) + "(object)" + m.group(2) + "\n" 
    out_file.write(line) 

out_file.close() 

आपको बस इतना करना है कि किसी कारण से नहीं करना चाहते हैं , तो सुनिश्चित करें, आगे बढ़ें और मूल वर्ग और object दोनों को उपclass। मेरे सबसे अच्छे ज्ञान के लिए, यह ठीक काम करना चाहिए; आपकी नई कक्षा एक नई शैली की कक्षा होगी।

पुस्तक Python in a Nutshell (O'Reilly द्वारा प्रकाशित एलेक्स मार्टेलि द्वारा) कहती है कि यदि आप बेस क्लास के साथ कक्षा घोषित करते हैं और कम से कम बेस क्लास में से एक नई शैली है, तो यह हमेशा एक नई शैली की कक्षा होगी । यह किसी भी विशेष चेतावनी या इस कार्रवाई से संबंधित खतरों की सूची नहीं है। मुझे लगता है कि आप जाने के लिए अच्छे हैं।

4

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

मुझे इस से होने वाली किसी भी वास्तविक समस्या से अवगत नहीं है। अधिकांश भाग के लिए, नई शैली की कक्षाएं वास्तव में नई सुविधाओं को लाती हैं, जैसे super() वास्तव में काम कर रही हैं। यदि आपके पास कोड है जो पुराने तरीके से पुराने शैली के वर्गों के अर्थशास्त्र पर निर्भर करता है, तो वह कोड निश्चित रूप से टूट जाएगा। (केवल उदाहरण है कि मन में आता है प्रसिद्ध Borg pattern प्रसिद्ध एलेक्स मार्टेली कर रहा है।)

Here नई शैली कक्षाओं बनाम पुरानी शैली ("क्लासिक") वर्ग की चर्चा के लिए अजगर संदर्भ मैनुअल के लिए एक लिंक है । और here क्लासिक निबंध का एक लिंक है जहां Guido van Rossum बताता है कि क्यों नई शैली के वर्ग पेश किए गए थे।

मैं अपने कोड में केवल नई शैली के वर्गों का उपयोग करता हूं और मैं आपको ऐसा करने के लिए प्रोत्साहित करता हूं।

+0

दिलचस्प लिंक के लिए धन्यवाद।ए पुरानी शैली क्यों है, इसकी नवीनतम टिप्पणियां देखें। – haridsv

+0

मैं जो कुछ पूछ रहा था उसे समझने के लिए मैं क्षमा चाहता हूं; कल मैंने थक गया होगा जब मैंने यह लिखा था। मैंने एक दूसरा जवाब लिखा है जो बेहतर है। – steveha

0

मुझे क्लासिक और नए-शैली के वर्गों को मिश्रित करने में कोई समस्या नहीं दिखाई देती है जब तक कि कुछ विधियां क्लासिक अर्थात् पर भरोसा न करें या आपका क्लासिक बेस मेटाक्लास का उपयोग करें (संतान का मेटाक्लास हमेशा एक नई शैली की कक्षा होगी)।

दूसरी ओर मुझे क्लासिक कक्षाओं का उपयोग करने का कोई कारण नहीं दिखता है, इसलिए class A: से class A(object): को बदलना पसंद है।

+0

मैं आपसे सहमत हूं, हालांकि, कक्षा ए उत्पन्न होता है। संदर्भ के लिए, जिस उपकरण के बारे में मैं बात कर रहा हूं वह जेएसआईआई पैकेज है जो wsdl2py और wsdl2dispatch उपकरण देता है। उन्हें 2007 में कभी-कभी बनाए रखा नहीं गया है, इसलिए सुनिश्चित नहीं है कि वे इसे पायथन 3.0 के लिए अपडेट करेंगे। अभी, मैं अभी भी 2.6 का उपयोग कर रहा हूं, इसलिए मुझे इन जेनरेट किए गए वर्गों में कोई समस्या नहीं है। मैंने SOAP सर्वर को लागू करने के लिए एक वैकल्पिक नया पैकेज भी नहीं देखा है। – haridsv

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