क्या यह __init_ के भीतर अपवाद उठाने के लिए खराब रूप माना जाता है? यदि ऐसा है, तो कुछ वर्ग चर को किसी भी या गलत प्रकार के रूप में प्रारंभ करने पर त्रुटि को फेंकने की स्वीकार्य विधि क्या है?पायथन: क्या यह __init__ के भीतर अपवाद उठाने का बुरा फ़ॉर्म है?
उत्तर
__init__()
के भीतर अपवाद बढ़ाना बिल्कुल ठीक है। एक कन्स्ट्रक्टर के भीतर त्रुटि स्थिति को इंगित करने का कोई और अच्छा तरीका नहीं है, और मानक लाइब्रेरी में कई सैकड़ों उदाहरण हैं जहां कोई ऑब्जेक्ट बनाना अपवाद बढ़ा सकता है।
त्रुटि वर्ग, निश्चित रूप से, आपके ऊपर है। ValueError
सर्वोत्तम है यदि निर्माता को अमान्य पैरामीटर पारित किया गया हो।
कन्स्ट्रक्टर में सबसे अधिक उपयोग किए गए अपवाद 'ValueError' और' TypeError' हैं। –
बस यह इंगित करते हुए कि '__init__' कन्स्ट्रक्टर नहीं है, इसका इंटियालाइज़र है। आप लाइन को संपादित करना चाहते हैं * एक कन्स्ट्रक्टर के भीतर त्रुटि स्थिति इंगित करने के लिए कोई और अच्छा तरीका नहीं है .. * – Haris
मुझे लगता है कि यह अंतर्निहित ValueError
अपवाद के लिए एकदम सही मामला है।
मानक पुस्तकालय का कहना है:
>>> f = file("notexisting.txt")
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
IOError: [Errno 2] No such file or directory: 'notexisting.txt'
इसके अलावा, मैं वास्तव में किसी भी कारण है कि यह बुरा रूप में माना जाना चाहिए नहीं दिख रहा।
मुझे कोई कारण नहीं दिखता कि यह खराब रूप होना चाहिए।
इसके विपरीत, बातें अपवाद अच्छी तरह से कर लिए जाने जाते हैं, के रूप में लौटने त्रुटि कोड के लिए विरोध में से एक यह है कि त्रुटि कोड आमतौर पर कंस्ट्रक्टर्स से नहीं वापस किया जा सकता है। तो कम से कम सी ++ जैसी भाषाओं में, त्रुटियों को सिग्नल करने का एकमात्र तरीका अपवाद उठाना एकमात्र तरीका है।
मैं उपर्युक्त सभी के साथ सहमत हूं।
वास्तव में यह संकेत देने का कोई और तरीका नहीं है कि किसी अपवाद को बढ़ाने के अलावा किसी अन्य वस्तु के आरंभ में कुछ गलत हो गया है।
अधिकांश कार्यक्रम कक्षाओं में जहां कक्षा की स्थिति पूरी तरह से उस वर्ग के इनपुट पर निर्भर होती है, हम उम्मीद कर सकते हैं कि किसी प्रकार का ValueError या TypeError उठाया जाए।
साइड इफेक्ट्स (जैसे नेटवर्किंग या ग्राफिक्स करता है) के साथ कक्षाएं init में त्रुटि उत्पन्न कर सकती हैं (उदाहरण के लिए) नेटवर्क डिवाइस अनुपलब्ध है या कैनवास ऑब्जेक्ट को नहीं लिखा जा सकता है। यह मेरे लिए समझदार लगता है क्योंकि अक्सर आप जितनी जल्दी हो सके विफलता स्थितियों के बारे में जानना चाहते हैं।
यह सच है कि एक निर्माता में त्रुटि इंगित करने का एकमात्र उचित तरीका अपवाद उठा रहा है। यही कारण है कि सी ++ में और अन्य ऑब्जेक्ट उन्मुख भाषाओं में जिन्हें अपवाद सुरक्षा के साथ दिमाग में डिजाइन किया गया है, किसी ऑब्जेक्ट के निर्माता में अपवाद डाला गया है (जिसका अर्थ है कि ऑब्जेक्ट का प्रारंभिक अधूरा है) तो विनाशक को नहीं कहा जाता है। यह अक्सर पियथन जैसे स्क्रिप्टिंग भाषाओं में मामला नहीं है। उदाहरण के लिए, निम्न कोड एक AttributeError फेंकता है तो socket.connect() विफल रहता है:
class NetworkInterface:
def __init__(self, address)
self.socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
self.socket.connect(address)
self.stream = self.socket.makefile()
def __del__(self)
self.stream.close()
self.socket.close()
कारण यह है कि अधूरा वस्तु के नाशक के बाद कनेक्शन का प्रयास विफल हो गया है इससे पहले कि धारा विशेषता प्रारंभ कर दिया गया है कहा जाता है, है । आपको रचनाकारों से अपवाद फेंकने से नहीं बचना चाहिए, मैं बस इतना कह रहा हूं कि पाइथन में पूरी तरह से अपवाद सुरक्षित कोड लिखना मुश्किल है। कुछ पायथन डेवलपर्स पूरी तरह से विनाशकों का उपयोग करने से बचते हैं, लेकिन यह एक और बहस का विषय है।
यह उत्तर वास्तव में उपयोगी है। यह सिर्फ "हरे रंग की रोशनी" के बारे में नहीं बोल रहा है, लेकिन "विनाशक" के साथ एक उदाहरण का उल्लेख करता है। – lpapp
कुछ मामलों में इनिट से त्रुटियां बढ़ाना अपरिहार्य है, लेकिन इनिट में बहुत अधिक काम करना एक खराब शैली है। आपको फैक्ट्री या छद्म फैक्ट्री बनाने पर विचार करना चाहिए - एक साधारण क्लासमेड जो ऑब्जेक्ट सेट अप करता है।
- 1. पायथन: __init__
- 2. पायथन: आवश्यक kwarg, जो उठाने के लिए अपवाद?
- 3. क्या "अपवाद फेंकता है" बुरा अभ्यास?
- 4. __init__ और पायथन
- 5. तर्क पर पायथन __init__ setattr?
- 6. पायथन जांच __init__ पैरामीटर
- 7. क्या MySQL वास्तव में यह बुरा है?
- 8. प्रिंटक, क्या वाकई यह बुरा है?
- 9. क्या यह सूची में बुरा है?
- 10. पायथन कक्षाएं और __init__ विधि
- 11. क्या यह $ _POST को लिखना बुरा व्यवहार है?
- 12. यदि तर्कों की गलत संख्या ** तर्कों में गुजरती है तो उठाने का क्या अपवाद है?
- 13. पायथन लॉगिंग अपवाद
- 14. पायथन अजीब अपवाद। क्या मुझे अपना पहला पायथन बग मिला है या यह एक नोब गलती है?
- 15. पायथन: हमेशा __init__ के बजाय __new__ का उपयोग करें?
- 16. कक्षा राज्य कब अमान्य है, उठाने में क्या त्रुटि है?
- 17. क्या यह गलत है (गलत) अपवाद का उपयोग करें। अपवाद वस्तुओं को पहचानने के लिए हेल्पलिंक?
- 18. "स्ट्रिंग गणित" क्या है और यह बुरा क्यों है?
- 19. वर्ग __init__ (नहीं उदाहरण __init__)
- 20. 'अविश्वसनीय कोड' क्या है और यह बुरा क्यों है?
- 21. __init__
- 22. क्या यह पायथन में एक कॉपी कन्स्ट्रक्टर के बराबर है?
- 23. __init__
- 24. पायथन में एक पैकेज का एपीआई। __init__.py में?
- 25. यह बुरा व्यवहार सीएसएस
- 26. पायथन-सूची के भीतर मूल्य का सब्सट्रेशन
- 27. अपवाद में पायथन अपवाद
- 28. क्या यह बुरा है कि C++ 0x के लैम्ब्डा अभिव्यक्तियों का नाम नहीं है?
- 29. क्या छुपे हुए क्षेत्रों का उपयोग करना बुरा व्यवहार है?
- 30. Google Analytics - क्या यह फ़ॉर्म डेटा एकत्र कर सकता है?
सी में, विनाशक में अपवाद बढ़ाने के लिए यह खराब रूप है, लेकिन कन्स्ट्रक्टर ठीक होना चाहिए। – Calyth
@ उत्प्रेरक, आपका मतलब सी ++ है - उस मामले के लिए सी –
... या अपवादों में कोई कन्स्ट्रक्टर या विनाशक नहीं हैं। –