2011-08-04 12 views
6

यह शायद पहले पूछा गया था लेकिन मुझे अपने विशिष्ट प्रश्न का उत्तर नहीं मिला (काफी सामान्य ...)उस वर्ग के लिए सहायक फ़ाइलों के संबंध में पाइथन क्लास परिभाषा को व्यवस्थित तरीके से व्यवस्थित कैसे करें?

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

मैं फ़ाइलों को व्यवस्थित कैसे करूं?

/school/ 
     pencil/ 
     book/ 
      __init__.py 
      read.py 
      burn.py 
      book.py 

मैं, कुछ इस तरह करने में सक्षम होना चाहता हूँ, क्योंकि यह सबसे समझ में आता है:

from school import Book 
b = Book(name="The Bible") 
b.read() 

लेकिन इसके बाद के संस्करण फ़ाइल संरचना से, मुझे क्या करना होगा:

from school.book import Book 
b = Book(....etc 

या

from school import book 
b = book.Book(...etc 

टी हेस अजीब/दोहराए गए हैं ... मैं यहाँ क्या खो रहा हूँ?

उत्तर

7

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

/school/ 
    pencil.py 
    book.py 
book.py अंदर

, तो आप इस

class Book(): 
    def __init__(self,name,author,isbn,your_variable_here): 
     #Your init method 

    def read(self,kid): 
     return "{0} is reading {1}.".format(kid,self.name) 

    def burn(self,library,lighter): 
     library.remove(self) 
     lighter.light(self) 
     return "Preparing to burn people." 

की तरह कुछ तो होगा, अपने आयात इस तरह दिखेगा।

from school import book 
    b = book.Book("The Art of War","Sun Tzu",'999342052X','Books rock!') 
    b.read(ike) #This assumes ike is an object, probably of the class Student, defined and imported from elsewhere 
    b.burn(library,lighter) #Once more, I'm assuming these are objects for which you've imported the definition and defined them earlier. 

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

+0

प्रतिक्रिया के लिए धन्यवाद। लेकिन क्या होगा यदि मेरी पढ़ाई() और जला() विधियां प्रत्येक सैकड़ों लाइनें हैं और मैं नहीं चाहता कि book.py कोड की एक बड़ी गड़बड़ी हो? – Ian

+1

प्रत्येक विधि सैकड़ों लाइनें है? ईमानदारी से, मैं रिफैक्टर करने के तरीकों को खोजने का प्रयास करता हूं ताकि यह कई छोटे कार्य हो। यह हमेशा संभव नहीं है, जाहिर है, लेकिन मैं अभी भी कोशिश करूँगा। आदर्श रूप से, आप चाहते हैं कि प्रत्येक कार्य एक काम करे, और केवल एक चीज, और आप इसे एक 'पृष्ठ' पर फिट करना चाहते हैं (चाहे वह मुद्रित पृष्ठ या स्क्रॉल किए बिना आपके संपादक की एक स्क्रीन हो)। उस ने कहा, भले ही मेरे पास कुछ काम थे जो कई सौ लाइन लंबी थीं, फिर भी मैं उन्हें एक ही कक्षा में रखूंगा। यह पाइथन के ऑब्जेक्ट मॉडल को बेहतर बनाता है और सब कुछ ढूंढना आसान है। – Jonathanb

+1

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

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