2010-01-27 13 views
9

__init__() ऑब्जेक्ट बनने पर फ़ंक्शन को कॉल किया जाता है। क्या इसे बनाए जाने के बाद ऑब्जेक्ट __init__() फ़ंक्शन फिर से कॉल करना ठीक है?पायथन: उसी उदाहरण पर __init __() को एकाधिक कॉल

instance = cls(p1=1, p2=2) 
# some code 
instance.__init__(p1=123, p2=234) 
# some more code 
instance.__init__(p1=23, p2=24) 

क्यों एक वस्तु पर किसी को भी करना चाहते हैं कॉल __init__() कि पहले से ही बनाई गई है चाहते हैं?

अच्छा सवाल। मैं इंस्टेंस के फ़ील्ड को फिर से शुरू करना चाहता हूं।

+1

यह एक भयानक डिज़ाइन है। आपके कोड को पढ़ने और बनाए रखने की कोशिश करने वाले लोग परेशान होंगे। सामान्य नामों के साथ सामान्य तरीकों का उपयोग करें। '__init__' को एक और विधि कॉल करें (उदा।, 'रीसेट') ताकि यह स्पष्ट हो कि क्या हो रहा है। –

उत्तर

10

__init__ किसी ऑब्जेक्ट पर एक से अधिक बार कॉल करना ठीक है, जब तक __init__ उस प्रभाव के साथ कोड किया गया है जिसे आप प्राप्त करना चाहते हैं (जो कुछ भी हो)। एक सामान्य मामला जहां यह होता है (इसलिए आप बेहतर कोड __init__ उचित रूप से कोड करेंगे! -) तब होता है जब आपकी कक्षा की __new__ विधि कक्षा का एक उदाहरण देता है: कारण __init__ लौटा हुआ उदाहरण पर कॉल करने के लिए (क्या हो सकता है दूसरा, या बीसवां, समय, यदि आप अपने __new__ के माध्यम से "रीसाइक्लिंग" उदाहरण रखते हैं! -)।

1

जहाँ तक मुझे पता है, यह किसी भी समस्याओं का कारण नहीं है (संपादित करें: के रूप में super(...).__init__(...) की कोषेर उपयोग द्वारा सुझाए गए), लेकिन मैं एक reset() विधि होने और यह दोनों __init__() में बुला लगता है और आप रीसेट करने की आवश्यकता है जब क्लीनर होगा।

3

आप कर सकते हैं, लेकिन यह __init__ को तोड़ने का इरादा है। बहुत सारे पायथन वास्तव में सिर्फ सम्मेलन है, इसलिए आप तब भी पालन कर सकते हैं और __init__ को केवल एक बार कॉल करने की उम्मीद कर सकते हैं। मैं init या reset नामक फ़ंक्शन बनाने की अनुशंसा करता हूं या जो कुछ आवृत्ति चर सेट करता है, उस समय उपयोग करें जब आप इंस्टेंस को रीसेट करना चाहते हैं, और __init__ बस init पर कॉल करें। यह निश्चित रूप से अधिक सेन दिखता है:

x = Pt(1,2) 
x.set(3,4) 
x.set(5,10) 
+0

+1: कृपया '__init__' को कॉल न करें यह आपके कोड को पढ़ने और बनाए रखने की अपेक्षाओं का उल्लंघन करता है। यह बस खराब डिजाइन है। –

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