2012-05-08 11 views
5

मुझे हाल ही में बताया गया था कि मुझे अपना कोड अलग फाइलों में रखना चाहिए; main.py, engine.py, settings.py और इसी तरह की तरह। इस निश्चित रूप से, आसान प्रबंधन, scalability और दूसरों की तरह, लाभ है ऐसा लगता है मेरे लिए जैसे कि यह भी कई कमियां हैं ...मेरे पायथन कोड को कई कक्षाओं में व्यवस्थित कैसे करें?

उदाहरण के लिए करता है, अगर मैं एक स्क्रिप्ट settings.py कहा जाता है, जहां परदे पर के आकार की तरह कुछ बातें वस्तुओं, सिमुलेशन और विभिन्न वस्तुओं के रंग की गति परिभाषित कर रहे हैं, मैं क्या करूँ यदि वे चर मेरी engine.py स्क्रिप्ट और मेरे main.py लिपि में दोनों की आवश्यकता है? क्या मैं इसे दो बार स्क्रिप्ट में आयात करता हूं? यह बदसूरत लगता है। क्या होगा यदि मेरी कुछ कक्षाएं, जो engine.py स्क्रिप्ट में हैं, को main.py से कोड की आवश्यकता है?

मुझे आप सटीक स्थिति को दिखाने के ...

मेरे main.py स्क्रिप्ट अपने आप में pygame आयात करता है, यह initializes, और इतने पर। इसमें एक कक्षा होती थी जो ऑनस्क्रीन ऑब्जेक्ट का प्रतिनिधित्व करती थी, और उस वर्ग में draw विधि थी, जिसे सिर्फ एक पायगम ड्रा फ़ंक्शन कहा जाता था। अब, जब मैं कक्षा को engine.py स्क्रिप्ट के अंदर रखता हूं, तो चीजें अब काम नहीं करतीं, क्योंकि Pygame वहां मौजूद नहीं है! मैं engine.py में दोनों settings.py और pygame आयात करने, और फिर main.py में इंजन आयात करने समाप्त हो गया है, लेकिन फिर यह एक इंजन ... से एक प्रारंभकर्ता की तरह है वहाँ इस तरह की चीजों से निपटने के लिए एक रास्ता है, सामान्य दिशा-निर्देश की तरह?

+1

ऐसा लगता है कि आप मॉड्यूल को आयात करने की कोशिश कर रहे हैं जिसमें आपने अपना कोड विभाजित किया है। यदि ऐसा है, तो आपको वास्तव में जहां भी जरूरी आयात करना चाहिए। – inspectorG4dget

+10

किसी भी परेशानी को आप अपने कोड को कई फाइलों में विभाजित करने में महसूस कर रहे हैं, जब आपको वापस जाना होगा और 5000 लाइन फ़ाइल को बनाए रखना होगा, तो आपने कुछ महीनों में नहीं देखा है! –

उत्तर

3

यहाँ के आयात के लिए आधिकारिक पीईपी दिशानिर्देश हैं: http://www.python.org/dev/peps/pep-0008/#imports

इसके अलावा, कृपया इस StackOverflow सवाल देखें: What are good rules of thumb for Python imports?

आप एक समस्या के बिना एक से अधिक वर्ग से एक चर आयात कर सकते हैं, लेकिन आप कोशिश करते हैं और संरचना चाहिए अपने कोड ताकि चीजें गोलाकार रूप से आयात नहीं किया जा सके। Circular import dependency in Python

1

आप इस मॉडल है, जो मदद कर सकता है आप चीजों को समझने पर एक नजर है चाहिए। मुझे लगता है कि यह एक है कि वास्तव में क्या आप

Model-View-Controller

यहाँ कुछ और दस्तावेज़ करना चाहते हैं के साथ सबसे अच्छा फिट है: http://www.wkoorts.com/wkblog/2007/12/23/mvc-design-patterns-with-python-links/

इस मामले में, आयात लग जाना चाहिए न कि तार्किक और आवश्यक । और मैं जोड़ता हूं कि यह वही है जो आप पहले से ही अपनी 3 फाइलों के साथ करते हैं।

+0

एमवीसी को इस सवाल के साथ क्या करना है? – rantanplan

+0

स्पष्टीकरण से, यह मेरे लिए तार्किक ध्वनि है कि वह एक MVC (डेटा, मुख्य कार्यक्षमता और सामने के छोर) का वर्णन है – jlengrand

+0

भी तो 'डेटा',' core' और 'सामने end' नीचे विभिन्न फाइलों के दसियों के लिए तोड़ा जा सकता है/प्रत्येक के लिए मॉड्यूल। तो उसका सवाल अभी भी लागू होता है। यह मुझे लगता है कि यह अप्रासंगिक है लेकिन मैं आपको नीचे संशोधित नहीं कर रहा हूं। – rantanplan

1

नहीं एक जवाब है, लेकिन:

settings.py वास्तव में settings.ini होना चाहिए, और आप इसे ConfigParser का उपयोग कर पढ़ना चाहिए। कॉन्फ़िगरेशन फ़ाइल को एक बार पढ़ें और परिणामस्वरूप ConfigParser.RawConfigParser मॉड्यूल के बीच साझा करें।

+0

लेकिन क्यों? यह बस एक परेशानी की तरह लगता है। मेरे पास एक साफ़, '.py' फ़ाइल हो सकती है जो 'वर्ग = मान' जैसा दिखता है, जैसा कि उन वर्गों के विपरीत है और यह भी ... इसके अलावा, मुझे एक स्क्रिप्ट चाहिए जो कॉन्फ़िगर को पढ़ती है, और फिर मुझे इसे हर जगह आयात करने की आवश्यकता है अन्य? क्या वह व्यावहारिक रूप से मैं अभी क्या कर रहा हूं, सिवाय इसके कि मैं उन मानों को सीधे सेट कर रहा हूं, उन्हें अलग फ़ाइल या कुछ से नहीं पढ़ रहा हूं? कृपया उत्तर दें, मैं जानना चाहता हूं! – corazza

+0

इतना ही नहीं, अगर मैं, उदाहरण के लिए, एक ट्यूपल को सहेजना चाहता हूं, तो यह एक स्ट्रिंग बन जाता है! – corazza

1

इसके अन्य भाषाओं (विशेष रूप से जावा, जहां इसकी व्यावहारिक रूप से संकलक द्वारा मजबूर) प्रति कक्षा एक फ़ाइल के लिए में आम बात।

अंतर-निर्भरता फ़ाइल आप का उल्लेख, आप वैश्विक चर से परहेज पर विचार करना चाहिए का सवाल है।

यहाँ एक और संबंधित सवाल है कि बेहतर आपके प्रश्न के उत्तर में है।

How many Python classes should I put in one file?

0

आप किसी भी मॉड्यूल वे की जरूरत है में settings.py से प्रतीकों आयात कर सकते हैं। यह अवधारणा है। एक वास्तविक समस्या तब होती है जब आपके पास परिपत्र आयात होता है। जैसे क्या होगा यदि आपके पास engine.py के अंदर कुछ प्रतीक थे जिन्हें main.py और इसके विपरीत में आवश्यक था। उस स्थिति में इन निर्भरताओं को तीसरे मॉड्यूल में तोड़ने के लिए एक आम पैटर्न है, जहां main.py और engine.py बिना किसी समस्या के आयात कर सकते हैं।

1

कई अन्य मॉड्यूल में एक मॉड्यूल आयात कर रहा है गंदा नहीं है। कोड के हजारों लाइनों के साथ मॉड्यूल की तुलना में यह बहुत क्लीनर है।

यह सच है कि परिपत्र आयात समस्याग्रस्त हैं। लेकिन आपकी स्थिति ऐसा नहीं लगता है कि एक परिपत्र आयात समस्या होने जा रही है। आप कहते हैं कि "अब, जब मैं कक्षा को अपनी engine.py स्क्रिप्ट के अंदर रखता हूं, चीजें अब काम नहीं करती हैं, क्योंकि Pygame वहां मौजूद नहीं है! मैं file.py और Pygame दोनों को import.py में आयात कर रहा हूं, और फिर आयात कर रहा हूं इंजन में.py.py "।

आप कक्षा को engine.py में क्यों नहीं डाल सकते हैं और फिर इसे main.py में आयात कर सकते हैं? यह करने के लिए एक बहुत ही सरल तरीका है अपने वर्ग के लिए एक कॉलबैक पारित करने के लिए होगा: अपनी राज्य:

# engine.py 
... 
class ClassWithDraw(Subclass): 
    def __init__(self, draw_callback): 
     ... 
     self._draw_func = draw_callback 
     ... 
    def draw(self): 
     self._draw_func() 

# main.py 

from engine import ClassWithDraw 
drawer = ClassWithDraw(drawfunc) 

क्या इस दृष्टिकोण के बारे में अच्छा है कि वस्तु वास्तव में एक बात के लिए ही जिम्मेदार है। दरअसल, इस ऑब्जेक्ट के लिए draw विधि नहीं होने के कारण यह अधिक समझ में आ सकता है; या इसमें draw_hook हो सकता है जिसे जब भी आवश्यक हो, उससे खींचने योग्य डेटा प्राप्त करने के लिए बुलाया जाएगा, और दूसरा बाहरी ड्रॉ फ़ंक्शन इसे कॉल कर सकता है।

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

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