2009-11-26 12 views
37

मैं पृष्ठभूमि से आया हूं जहां मैं आमतौर पर प्रति कक्षा एक फ़ाइल बनाते हैं। मैं निर्देशिकाओं के तहत भी सामान्य कक्षाओं को व्यवस्थित करता हूं। यह अभ्यास मेरे लिए सहज है और यह C++, PHP, JavaSript, आदि में प्रभावी साबित हुआ हैमॉड्यूल और पैकेज व्यवस्थित करने का पाइथोनिक तरीका

मुझे इस रूपक को पायथन में लाने में समस्या हो रही है: फ़ाइलें केवल फाइलें नहीं हैं, लेकिन वे औपचारिक मॉड्यूल हैं। मॉड्यूल में केवल एक वर्ग होने का अधिकार नहीं लगता --- अधिकांश वर्ग स्वयं ही बेकार हैं। अगर मेरे पास automobile.py और Automobile वर्ग है, तो यह हमेशा automobile.Automobile के रूप में संदर्भित करने के लिए मूर्खतापूर्ण प्रतीत होता है।

लेकिन, साथ ही, कोड के एक टन को एक फ़ाइल में फेंकने और इसे एक दिन कॉल करने का अधिकार नहीं लगता है। जाहिर है, एक बहुत जटिल आवेदन में 5 से अधिक फाइलें होनी चाहिए।

सही --- या पायथनिक --- रास्ता क्या है? (या यदि कोई सही तरीका नहीं है, तो आपका पसंदीदा तरीका क्या है और क्यों?) पाइथन मॉड्यूल में मुझे कितना कोड फेंकना चाहिए?

+0

डुप्लिकेट: http://stackoverflow.com/questions/1642975/folder-and-file-organization-for-python-development –

+1

डुप्लिकेट: http://stackoverflow.com/questions/106896/how-many-python -कक्षाएं-चाहिए-ए-डाल-इन-वन-फ़ाइल –

उत्तर

31

"पैकेजिंग की लॉजिकल यूनिट" के संदर्भ में सोचें - जो एक ही कक्षा हो सकती है, लेकिन अक्सर कक्षाओं का एक सेट होगा जो बारीकी से सहयोग करते हैं। कक्षाएं (या मॉड्यूल-स्तरीय फ़ंक्शंस - मॉड्यूल-स्तरीय फ़ंक्शंस भी पसंद के रूप में उपलब्ध होने पर हमेशा स्थिर तरीकों का उपयोग करके "पायथन में जावा करें"! -) को इस मानदंड के आधार पर समूहीकृत किया जा सकता है। असल में, यदि ए के अधिकांश उपयोगकर्ताओं को भी बी की आवश्यकता होती है और इसके विपरीत, ए और बी शायद एक ही मॉड्यूल में होना चाहिए; लेकिन यदि कई उपयोगकर्ताओं को केवल उनमें से एक की आवश्यकता होगी, न कि दूसरे, तो उन्हें शायद अलग मॉड्यूल में होना चाहिए (शायद उसी पैकेज में, यानी, __init__.py फ़ाइल में निर्देशिका)।

मानक पायथन पुस्तकालय, जबकि सही से दूर, प्रतिबिंबित (अधिकतर) उचित रूप से अच्छे प्रथाओं को प्रतिबिंबित करता है - ताकि आप अधिकतर उदाहरण से इसे सीख सकें। उदाहरण के लिए, threading पाठ्यक्रम का मॉड्यूल Thread वर्ग परिभाषित करता है ... लेकिन इसमें सिंक्रनाइज़ेशन-आदिम वर्ग भी शामिल हैं जैसे ताले, घटनाएं, परिस्थितियां, और सेमफोर, और एक अपवाद-वर्ग जिसे थ्रेडिंग ऑपरेशंस द्वारा उठाया जा सकता है (और कुछ और चीज़ें)।यह उचित आकार (800 लाइनों सहित व्हाइटस्पेस और डॉकस्ट्रिंग्स) के ऊपरी बाउंड पर है, और कुछ महत्वपूर्ण धागे से संबंधित कार्यक्षमता जैसे कि क्यूई को एक अलग मॉड्यूल में रखा गया है, फिर भी यह एक अच्छा उदाहरण है कि यह कितनी कार्यक्षमता है जो अभी भी समझ में आता है एक मॉड्यूल में पैक करने के लिए।

7

आप अपने एक वर्ग-प्रति-फाइल सिस्टम पर कायम करना चाहते हैं (जो तार्किक, मुझे गलत नहीं मिलता है), तो आप automobile.Automobile का उल्लेख करने से बचने के लिए कुछ इस तरह कर सकते हैं:

from automobile import Automobile 
car = Automobile() 

लेकिन, जैसा कि cobbal से उल्लेख किया है, फ़ाइल प्रति एक से अधिक वर्ग पायथन में बहुत आम है। किसी भी तरह से, जब तक आप एक समझदार प्रणाली चुनते हैं और लगातार इसका उपयोग करते हैं, मुझे नहीं लगता कि कोई भी पाइथन उपयोगकर्ता आप पर पागल हो रहे हैं :)।

4

मध्य आकार के प्रोजेक्ट में, मैंने खुद को निकट से संबंधित वर्गों के कई सेटों के साथ पाया। उनमें से कई सेट अब फाइलों में समूहित हैं; उदाहरण के लिए, निम्न-स्तरीय नेटवर्क कक्षाएं सभी एक network मॉड्यूल में हैं। हालांकि, कुछ सबसे बड़ी कक्षाओं को अपनी फाइल में विभाजित कर दिया गया है।

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

8

यदि आप सी ++ बिंदु दृश्य से आ रहे हैं, तो आप एक .so या .dll के समान पायथन मॉड्यूल देख सकते हैं। हाँ वे स्रोत फ़ाइलों की तरह दिखते हैं, क्योंकि पायथन लिपिबद्ध है, लेकिन वे वास्तव में विशिष्ट कार्यक्षमता के लोड करने योग्य पुस्तकालय हैं।

एक और रूपक जो मदद कर सकता है वह है कि आप नामस्थान के रूप में पाइथन मॉड्यूल देख सकते हैं।

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