2013-06-27 6 views
7

बनाने की वापसी विफलता सबसे पहले, मुझे पता है कि __init__() पायथन में किसी वर्ग का फ़ंक्शन कोई मान नहीं लौटा सकता है, इसलिए दुख की बात यह विकल्प अनुपलब्ध है।पायथन __init__

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

मैं सोच रहा था कि इसके साथ जारी रखने का सबसे अच्छा तरीका क्या है। मैंने एक वैश्विक बूलियन को 'वैध निर्माण' ध्वज के रूप में स्थापित करने पर विचार किया है, लेकिन मैं नहीं करना चाहूंगा।

कोई अन्य विचार (पुनर्गठन के अलावा प्रारंभिकरण के बाहर हो सकता है और मूल्य तर्क के रूप में पारित किए जाते हैं)? मैं मूल रूप से सफलता पर वापसी 0 और शुरुआत के दौरान विफलता पर वापसी -1 का एक तरीका तलाश रहा हूं। (अधिकांश सी सिस्टम कॉल की तरह)

+8

एक अपवाद उठाएं। –

+1

सफलता पर 0 लौटने और विफलता पर -1 बहुत ही पाइथोनिक है। त्रुटि रिटर्न खराब हैं, क्योंकि उन्हें अनदेखा करना आसान है, और वर्बोज़ को संभालने में आसान है। उस के शीर्ष पर, 0 और -1 का उपयोग बूलियन मानों के रूप में केवल किसी लाभ के साथ भ्रम जोड़ता है। सी कोड लिखने के लिए पायथन का उपयोग करने के लिए सच नहीं है। – abarnert

+0

जैसा कि @jsbueno अपने उत्तर में बताता है, क्लास उदाहरण _initialit_ को '__init __()' में बनाया गया है, जो नहीं बनाया गया है, यही कारण है कि यह एक मान वापस नहीं करता है। ऐसा करने में असफलताओं को पहचानने या अपवाद फेंकने के लिए वैश्विक चर का उपयोग करने के बजाय, आप अपने राज्य को इंगित करने के लिए अपनी कक्षा में एक डेटा सदस्य जोड़ सकते हैं और उसके बाद अपना मान सीधे जांच सकते हैं या एक विधि को कॉल कर सकते हैं जो '__init __()' के बाद अपना मान देता है यह निर्धारित करने के लिए कहा जाता है कि कुछ गलत (और संभवतः क्या) गलत है। – martineau

उत्तर

11

जब या तो assertio असफल आप एक अपवाद बढ़ा सकता है, या -, यदि आप वास्तव में नहीं चाहते हैं या अपवादों के साथ काम नहीं कर सकता, आप अपनी कक्षाओं में __new__ विधि लिख सकते हैं - अजगर में , __init__ तकनीकी तौर पर एक है "प्रारंभकर्ता" विधि - और इसे गुणों में भरना चाहिए और कुछ संसाधनों को प्राप्त करना चाहिए और दूसरों को अपने जीवन चक्र के दौरान आपकी वस्तु की आवश्यकता होगी - हालांकि, पाइथन वास्तविक निर्माता, __new__ विधि को परिभाषित करता है, जिसे __init__ से पहले कहा जाता है - और इसके विपरीत, __new__ वास्तव में एक मूल्य वापस करता है: नव निर्मित (अनियमित) उदाहरण स्वयं।

तो आप अपने चेक __new__ के अंदर रख सकते हैं और बस वापस लौट सकते हैं कोई भी कुछ विफल नहीं होता है - अन्यथा, सुपरक्लास __new__ विधि पर कॉल का परिणाम वापस लौटाएं (कोई शुद्ध पायथन में ऑब्जेक्ट के लिए वास्तविक स्मृति आवंटन नहीं कर सकता है, तो अंत में आप एक निर्माता एक सुपर क्लास में मूल कोड में लिखा कॉल करनी होगी - आम तौर पर यह आपके वर्ग पदानुक्रम के आधार में object.__new__ है

नायब:। अजगर 2 में, आप के लिए आधार वर्ग के रूप में object होना आवश्यक है आपका पदानुक्रम - अन्यथा न केवल __new__ को नहीं कहा जाता है, क्योंकि बाद में पाइथन वस्तुओं में जोड़े गए कई सारे फीचर्स काम नहीं करेंगे। संक्षेप में, class MyClass(object):, कभी भी class MyClass: - जब तक कि आप Python3 पर न हों।

+0

आप कहते हैं कि '__new__'' __init__' से पहले कहा जाता है। मैंने बस यह कोशिश की, लेकिन जब मैं कक्षा (पीई 2.7) का उदाहरण बनाता हूं तो '__new__' नहीं कहा जाता है। –

+0

मुझे यह मिला। आपको अपनी कक्षा में वस्तु का विस्तार करने की आवश्यकता है। इसके बिना, नया नहीं कहा जाएगा! –

+0

नहीं। यदि मैं ऑब्जेक्ट बेस क्लास को छोड़ देता हूं, तो '__new__' स्वचालित रूप से नहीं कहा जाता है। जाओ पता लगाओ! –

0

क्या आपने अपवाद उठाया है? विफलता को सिग्नल करने का यह सामान्य तरीका है।

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