2011-11-09 24 views
5

मैं निम्न फ़ोल्डर संरचना है:अजगर - गतिशील वर्ग आयात

- MyProject 
    - App1 
     - some_module1.py 
     - some_module2.py 
    - App2 
     - some_other_module1.py 
     - some_other_module2.py 

मॉड्यूल (उदाहरण के लिए some_module1.py) वहाँ एक वर्ग है कि एक आधार वर्ग से फैली हुई है, मेरे मामले में है में से प्रत्येक के अंदर, निर्माता ।

जो मैं करने की कोशिश कर रहा हूं वह इस वर्ग में गतिशील रूप से लोड हो रहा है।

INSTALLED_APPS = (
    'App1', 
    'App2', 
) 

मैं एक समारोह है कि एक विशेष निर्माता वर्ग के लिए प्रत्येक "एप्लिकेशन" पैकेज की जाँच करें और सुनिश्चित करें कि यह तक फैली हुई है जाएगा लिखने के लिए कोशिश कर रहा हूँ: ऐसा करने के लिए, मैं "इंस्टॉल किए गए एप्लिकेशन" है कि इस तरह दिखता है की एक सूची है निर्माता बेस क्लास। कुछ इस तरह:

module_class = 'some_module1.SomeClass' 

# Loop through each package in the INSTALLED_APPS tuple: 
for app in INSTALL_APPS: 
    try: 
     #is the module_class found in this app? 
     #App1.some_module1.SomeClass - Yes 
     #App2.some_module1.SomeClass - No 

     # is the class we found a subclass of Producer? 
    exception ImportError: 
     pass 

मैं इम्प और importlib के साथ प्रयोग करने की कोशिश की है, लेकिन यह आयात के इस प्रकार संभाल करने के लिए प्रतीत नहीं होता। क्या यह मेरे लिए इसे प्राप्त करने में सक्षम है?

+0

क्षमा करें - यह पता लगाना संभव नहीं है कि आप क्या चाहते हैं - आपका छद्म कोड अस्पष्ट है। पाइथन सही जगहों से आने वाले अबाउट वर्गों का ख्याल रखता है, हाउयर। ताकि कोई भी App1.Class_ "निर्माता" दिखाई देगा क्योंकि इसे App1 मॉड्यूल के अंदर परिभाषित किया गया है। – jsbueno

+0

क्षमा करें, मैंने जितना संभव हो उतना स्पष्ट होने की कोशिश की। मैंने पोस्ट में संपादित किया है और उम्मीद है कि यह अधिक समझ में आता है। – Hanpan

उत्तर

5

आप पर एक नजर है कर सकते हैं:

  • __import__() स्ट्रिंग के रूप में उनके नाम जानते हुए भी मॉड्यूल आयात करने के लिए; मॉड्यूल की सभी वस्तुओं (विशेषताओं, कार्यों, आदि) के नाम प्राप्त करने के लिए
  • dir(); मॉड्यूल की वस्तुओं के बीच कक्षाओं की पहचान करने के लिए
  • inspect.isclass(getattr(<module ref>, <object name>));
  • issubclass() किसी दिए गए वर्ग, as explained here से उप-वर्गों की पहचान करने के लिए।

इन उपकरणों के साथ, आप किसी दिए गए मॉड्यूल में सभी कक्षाओं की पहचान कर सकते हैं, जो किसी दिए गए वर्ग को विरासत में ले रहे हैं।

मैं इस तंत्र का उपयोग गतिशील रूप से दिए गए मॉड्यूल से कक्षाओं को त्वरित करने के लिए कर रहा हूं, ताकि उनके अपडेट स्वचालित रूप से ऊपरी स्तर पर खाते में ले जा सकें।

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