2010-12-19 17 views
5

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

class One(object): 
    try: 
     import OneHelper 
    except ImportError: 
     pass 
    def __init__(self): 
     # this function doesn't use OneHelper 
     ... 

    def blah(self): 
     # this function does 
     OneHelper.blah() 

यह एक NameError: global name 'OneHelper' is not defined जब One.blah() समारोह कहा जाता है का कारण बनता है। अब तक एकमात्र चीज जो मैंने पाया है वह काम करता है जो मॉड्यूल को वास्तविक कार्यों में आयात कर रहा है जो इसका उपयोग करते हैं। तो:

class One(object): 
    def __init__(self): 
     # this function doesn't use OneHelper 
     ... 

    def blah(self): 
     try: 
      import OneHelper 
     except ImportError: 
      pass 
     # this function does 
     OneHelper.blah() 

लेकिन मैं प्रत्येक कार्य मैं में उपयोग करना चाहते हैं, मैं इसे पूरी कक्षा के लिए उपलब्ध रहना चाहता हूँ में मॉड्यूल आयात करने के लिए नहीं करना चाहते हैं, लेकिन केवल यदि का एक उदाहरण वह वर्ग तत्काल है। क्षमा करें अगर मैं पर्याप्त स्पष्ट नहीं हो रहा हूं ...

+0

आप एक ऐसा फ़ंक्शन बनाने का प्रयास कर सकते हैं जो क्लास को तत्काल आयात करता है और फिर फ़ंक्शन को अन्य कार्यों के भीतर से कॉल करता है। शायद छोटे कामकाज। –

उत्तर

8

import OneHelper कक्षा में ठीक काम करता है, जिससे इसे कक्षा विशेषता मिलती है। आप अपनी कक्षा को परिभाषित करने के बाद dir(One) के साथ इसे सत्यापित कर सकते हैं - आपकी OneHelper विशेषता है। One.OneHelper मॉड्यूल का एक संदर्भ है। एक उदाहरण में, निश्चित रूप से, आप इसे अपने तरीकों से self.OneHelper के रूप में एक्सेस कर सकते हैं। __init__ पर (आप भी One.OneHelper के रूप में यह उपयोग करने के लिए जारी कर सकते हैं।)

+0

बेशक, अब मुझे बेवकूफ लगता है:/अंतर्दृष्टि के लिए धन्यवाद! –

+0

बेवकूफ महसूस न करें ... यह मानना ​​पूरी तरह से उचित है कि 'आयात' हमेशा मॉड्यूल के वैश्विक नामस्थान में आयात करता है क्योंकि 99.44% उपयोगों में यही होता है। बेशक, यह वास्तव में यह कैसे काम करता है, लेकिन यह एक अनुचित प्रारंभिक बिंदु नहीं है। मुझे यह सुनिश्चित करने के लिए खुद का परीक्षण करना पड़ा कि यह कैसे व्यवहार करता है। सौभाग्य से, जब आप सुनिश्चित नहीं हैं, थोड़ा प्रयोग और निरीक्षण आपको पायथन में एक लंबा रास्ता देगा। – kindall

2

आयात यह और कुछ संपत्ति की विशेषता:

class One(object): 
    def __init__(self): 
     try: 
      import OneHelper 
     except ImportError: 
      self.OneHelper = None 
     else: 
      self.OneHelper = OneHelper 
    def blah(self): 
     if self.OneHelper: 
      self.OneHelper.blah() 

आपका उदाहरण अजीब लग रहा है क्योंकि अगर मॉड्यूल आयात करने के लिए बुलाने की बात है क्या विफल रहता है बाद में?

+0

+1 आपको लगभग अपवाद नहीं पकड़ना चाहिए और 'सिवाय' ब्लॉक में कुछ भी नहीं करना चाहिए, और यह 'आयात त्रुटि' के लिए दोगुना हो जाता है, जिसे आपको लगभग कभी नहीं पकड़ना चाहिए (यानी जब आप किसी प्रकार का फ़ॉलबैक करते हैं)। –

0

आप मॉड्यूल आयात करने से पहले global OneHelper का उपयोग करने पर भी विचार कर सकते हैं। यह वनहेल्पर को वैश्विक नामस्थान में जोड़ता है।

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