2016-04-11 7 views
6

मेरे पास एक पायथन 3.5 प्रोजेक्ट है जिसे मैंने प्रति मॉड्यूल एक कक्षा बनाने का फैसला किया है। मैंने ऐसा करने का फैसला किया क्योंकि मुझे पता चला कि मेरी फाइलें बहुत लंबी थीं और मुझे यह समझना मुश्किल था कि क्या हो रहा है।एक एकल नेमस्पेस में mutliple मॉड्यूल समूह कैसे समूह?

बाद मैं परिवर्तन मुझे लगता है कि मैं अपने आप को प्रत्येक आयात फ़ाइल में दोहरा रहा हूँ बनाया:

from school.student import Student 
from school.classroom import ClassRoom 
from school.teacher import Teacher 

वहाँ कोई तरीका है कि बार-बार पारित? मैं चाहूँगा कि मेरी आयात अधिक तरह होगा:

from school import Student, ClassRoom, Teacher 
+3

"जिसे मैंने प्रति मॉड्यूल एक वर्ग बनाने का फैसला किया" - क्यों? यह जावा नहीं है; आपको ऐसा करने की ज़रूरत नहीं है। – user2357112

+2

इस मामले में प्रति वर्ग एक वर्ग क्यों? क्या वे एक ही डोमेन के सभी मॉडल नहीं हैं? शायद वे एक साथ हैं? – fips

+0

उन्होंने कहा कि उन्होंने इसे पठनीयता के लिए किया है, जो एक बहुत ही उचित प्रेरणा है। – fgblomqvist

उत्तर

6

यह पूरा करने के लिए एक __init__ मॉड्यूल का उपयोग करें। माता-पिता मॉड्यूल/पैकेज आयात होने पर __init__ मॉड्यूल की सामग्री का मूल्यांकन किया जाता है। इस तरह:

# __init__.py 
from school.student import Student 
from school.classroom import ClassRoom 
from school.teacher import Teacher 

यह Student, ClassRoom और Teacherschool नाम स्थान में लाता है। अब आप चाहें school मॉड्यूल का उपयोग कर आयात कर सकते हैं।

सावधानी: इस तरह से अपने नेमस्पेस को प्रदूषित करना वास्तव में आसान है। आपके द्वारा शुरू किए गए तरीके से प्रत्येक मॉड्यूल में स्पष्ट रूप से आयात करना बेहतर है, या this answer में दृष्टिकोण का उपयोग करना और स्पष्ट मॉड्यूल संदर्भों (उदाहरण के लिए school.Teacher()Teacher()) के बजाय अपने वर्गों का उपयोग करना बेहतर है।

यदि आपको लगता है school.Teacher() बहुत लंबा है, तो आप चीजों को थोड़ा इस तरह से छोटा कर सकते हैं:

वस्तुओं
import school as sch 
teacher = sch.Teacher() 

आदि आदि

हालांकि, दूसरे हाथ पर, अगर उन वर्गों हैं कि पैकेज स्तर पर उपलब्ध होना चाहिए, उन्हें पैकेज नामस्थान में आयात करना शायद सही काम है। केवल आप ही दृढ़ संकल्प कर सकते हैं।

0

हाँ, आप कर सकते हैं। बस मॉड्यूल school.py में सभी वर्गों को रखें। यही पायथन मॉड्यूल के लिए हैं। आपने जो हमें अभी दिखाया है वह जावा संकुल के माध्यम से नेमस्पेस को बनाए रखने का तरीका (संभवतः) है। आप अभी भी तो इस तरह से जाना चाहते हैं तो सिर्फ एक मॉल all.py

# all.py 
from school.student import Student 
from school.classroom import ClassRoom 
from school.teacher import Teacher 

बनाने के लिए और लिखते हैं, और आप मुख्य फ़ाइल, from school.all import Student, ClassRoom, Teacher लिखने लेकिन आपको लगता है कि अनावश्यक और बदसूरत देख सकते हैं।

5

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

आप पैकेज अब इस तरह दिखना चाहिए:

school/ 
__init__.py 
student.py 
classroom.py 
teacher.py 

तो फिर तुम __init__.py इस तरह दिखना चाहिए:

from .student import Students 
from .classroom import ClassRoom 
from .teacher import Teacher 

अगला केवल कॉल अपने वर्ग इस तरह के पैकेज नाम का उपयोग:

import school 
t = school.Teacher()