2011-02-25 17 views
7

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

पठनीयता प्रयोजनों के लिए मैं प्रत्येक वर्ग परिभाषा को अलग फ़ाइल में रखना चाहता हूं (वे काफी लंबा हो रहे हैं!), और ये सभी वर्ग एक निर्देशिका में हैं। जब भी मैं नई फाइल बना देता हूं, हालांकि यह सामग्री दृश्यमान होती है जहां मुझे उनकी आवश्यकता होती है, अंदर की कक्षा परिभाषा को अनियंत्रित मॉड्यूल के साथ स्कॉप्ड किया जाता है।

मुझे यह कैसे करना चाहिए? ऐसा करने के लिए 'पायथन' तरीका क्या है?

उत्तर

8

उन्हें सभी को __init__.py के भीतर आयात करें, और फिर उपभोक्ता पैकेज आयात करें।

from .module1 import Class1 
from .module2 import Class2 
... 
+0

पूर्ववर्ती डॉट क्या मतलब है? – samuil

+0

@ सैमुइल: http://www.python.org/dev/peps/pep-0328/ –

+0

अफसोस की बात है, मैं पाइथन 2.4 तक सीमित हूं, क्योंकि स्क्रिप्ट तीसरे पक्ष के एम्बेडेड डिवाइस पर चलेंगे। यह डॉट नोटेशन विरासत संस्करण में काम नहीं कर रहा है। मैंने इसे इन सब-मॉड्यूल के पूर्ण पथ से बदल दिया है। – samuil

3

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

कुंजी याद रखना है कि __init__.py फ़ाइल एक बड़े पैमाने पर अनियंत्रित पायथन स्क्रिप्ट है, और इसलिए पैकेज के नामस्थान में क्या है यह निर्धारित करने के लिए अपने आप को काफी परिष्कृत प्रसंस्करण करने के लिए स्वतंत्र है।

फ़ाइल package\__init__.py:

def _import_package_files(): 
    """ Dynamically import all the Python modules in this module's sub directory. """ 
    import os 
    import sys 
    import traceback 

    package_path = os.path.split(__file__)[0] 
    package_directory = os.path.split(package_path)[1] 

    for fn in os.listdir(package_directory): 
     globals_, locals_ = globals(), locals() 
     # process all python files in directory that don't start with underscore 
     if fn[0] != '_' and fn.split('.')[-1] in ('py', 'pyw'): 
      modulename = fn.split('.')[0] # filename without extension 
      subpackage = ".".join([package_directory, modulename]) 
      try: 
       module = __import__(subpackage, globals_, locals_, [modulename]) 
      except: 
       traceback.print_exc(file=sys.stdout) 
       raise # reraise exception 

_import_package_files() 

फ़ाइल package\Class1.py:

class Class1(object): 
    pass 

फ़ाइल package\Class2.py:

class Class2(object): 
    pass 

फ़ाइल package\Class3.py:

class Class3(object): 
    pass 

फ़ाइल usepackage.py: usepackage.py चलने से

import package 

print(package.Class1) 
print(package.Class2) 
print(package.Class3) 

आउटपुट:

<module 'package.Class1' from 'C:\Files\package\Class1.pyc'> 
<module 'package.Class2' from 'C:\Files\package\Class2.pyc'> 
<module 'package.Class3' from 'C:\Files\package\Class3.pyc'> 
+0

यह कमाल है। पाइथन 3.4.1 में काम करता है। – blockloop

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