2012-03-12 17 views
6

मेरे पास एक प्रोग्राम है जो मैं पायथन में लिख रहा हूं जो निम्न करता है:पाइथन खराब में verbose __init__ विधियां हैं?

उपयोगकर्ता फ़ोल्डर के नाम में प्रवेश करता है। उस फ़ोल्डर के अंदर विभिन्न एक्सटेंशन के साथ 8-15 .dat फ़ाइलें।

प्रोग्राम उन डेटा फ़ाइलों को खोलता है, उन्हें SQL डेटाबेस में प्रवेश करता है और फिर उपयोगकर्ता को डेटाबेस में किए गए विभिन्न परिवर्तनों को चुनने की अनुमति देता है। फिर डेटाबेस को .dat फ़ाइलों पर वापस निर्यात किया जाता है। लगभग 5-10 विभिन्न ऑपरेशन किए जा सकते हैं जिन्हें किया जा सकता है।

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

क्या यह कार्रवाई __init__ विधि में होनी चाहिए? या क्या यह कार्रवाई हमें विभिन्न उदाहरण विधियों में ले जाया जाना चाहिए जिन्हें __init__ विधि में बुलाया जाना चाहिए? या इन तरीकों को कहीं और होना चाहिए, और केवल तब कहा जाना चाहिए जब कार्यक्रम में कहीं और विशेषता की आवश्यकता हो?

मैंने जावा में इस कार्यक्रम को पहले से ही लिखा है। और मेरे पास एक निर्माता था जिसने ऑब्जेक्ट के गुणों को सेट करने के लिए कक्षा में अन्य विधियों को बुलाया था। लेकिन मैं सोच रहा था कि पाइथन में मानक अभ्यास क्या होगा।

उत्तर

1

ऐसा लगता है कि आप का वर्णन कर रहे हैं, प्रारंभिक हैं, इसलिए उन्हें __init__ में रखना ठीक है। दूसरी तरफ, ये क्रियाएं बहुत महंगा लगती हैं, और शायद किसी प्रोग्राम के दूसरे भाग में उपयोगी होती हैं, इसलिए हो सकता है कि आप उन्हें कुछ अलग फ़ंक्शन में समाहित करना चाहें।

1

__init__ विधि को तत्काल चालू होने पर विधि कहा जाता है।

सी ++ पृष्ठभूमि से आ रहा है, मुझे विश्वास है कि कन्स्ट्रक्टर में प्रारंभिक के अलावा वास्तविक कार्य करना अच्छा नहीं है।

1

__init__ विधि होने में कोई समस्या नहीं है, लेकिन मैं इसे आसानी से टालना चाहूंगा क्योंकि परीक्षण करना अधिक कठिन है। मेरा दृष्टिकोण छोटे तरीकों को बनाना होगा जिन्हें __init__ से बुलाया जाता है। इस तरह आप उन्हें और प्रारंभिक रूप से प्रारंभिक परीक्षण कर सकते हैं।

चाहे आवश्यक हो या आगे बढ़ने पर उन्हें बुलाया जाना चाहिए, वास्तव में उस पर निर्भर करता है कि आपको क्या करना है। यदि वे महंगी परिचालन हैं, और आमतौर पर सभी आवश्यक नहीं होते हैं, तो शायद आवश्यकता होने पर उन्हें केवल कॉल करना बेहतर होगा। दूसरी तरफ, आप उन्हें आगे बढ़ाना चाहेंगे ताकि गुणों की आवश्यकता होने पर कोई अंतराल न हो।

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

+0

अनिवार्य रूप से मेरे पास फाइलों का एक समूह है जिसे "नौकरी" के रूप में वर्गीकृत किया जा सकता है। कार्यक्रम के वांछित परिणाम उत्पन्न करने के लिए विभिन्न कार्य इस नौकरी पर विभिन्न कार्रवाइयां करते हैं। यही कारण है कि मैंने सोचा कि यह इसे कक्षा के रूप में सबसे अच्छा रखता है। –

+0

और यह इस तरह लगता है कि तुम क्या सुझाव दे रहे है: __init __ (स्वयं, फ़ोल्डर): self.filelist = getfilelist (...); self.fileversion = getfileversion (...); आदि? उदाहरण के अलावा कि विधियों में से एक महंगा है और केवल कुछ मामलों में आवश्यक है? –

+0

यदि आपका कोड क्या कर रहा है, तो शायद आपको [आलसी गुण] (http://stackoverflow.com/q/3012421/1235039) का उपयोग करना चाहिए। ऐसा करने के कई तरीके हैं, यह केवल आपकी आवश्यकताओं और वरीयता पर निर्भर करता है। – aquavitae

3

ठीक है, पाइथन में अच्छे ओओपी प्रथाओं के बारे में कुछ खास नहीं है। छोटे और छोटे टुकड़ों में एक बड़ी विधि का विघटन जावा और पायथन दोनों में बहुत अच्छा विचार है।

class GroupDescriptor(object): 
    def __init__(self, file_dictionary): 
     self.file_dict = file_dictionary 
     self.load_something(self.file_dict['file_with_some_info']) 

    @classmethod 
    def from_filelist(cls, list_of_files): 
     file_dict = cls.get_file_dict(list_of_files) 
     return cls(file_dict) 

    @classmethod 
    def from_dirpath(cls, directory_path): 
     files = self.list_dir(directory_path) 
     return cls.from_filelist(files) 

इसके अलावा, मैं नहीं जानता कि यह कैसे जावा में है, लेकिन अजगर में आप निर्माता में अपवाद के बारे में चिंता करने के लिए, क्योंकि वे कर रहे हैं की जरूरत नहीं है: अन्य बातों के अलावा छोटे तरीकों से आप विभिन्न निर्माताओं के बारे में करने का अवसर देता बारीक से संभाला। इसलिए, फाइलों जैसी अपवाद-प्रवण चीजों के साथ काम करना पूरी तरह से सामान्य है।

+0

+1 अब तक का सबसे अच्छा जवाब! ;-) मैं "polymorphic" कन्स्ट्रक्टर/प्रारंभिक परिष्करण परिष्करण के साथ अपघटन को प्यार करता हूं, भले ही यह थोड़ा सा गड़बड़ हो, क्योंकि आपने इसे विस्तृत नहीं किया है! –

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