2012-11-30 13 views
6

मैं अपना कोड पुनर्गठित कर रहा हूं और इसलिए नए नामस्थान बना रहा हूं। मैं मॉड्यूल के लिए "स्थैतिक" कक्षाएं (प्रत्येक विधि में @staticmethod के साथ कक्षाएं) बदल रहा हूं। यह जाने का रास्ता है, है ना?मॉड्यूल के बीच संसाधनों का अच्छा अभ्यास साझा करना?

समस्या यह है कि मुझे इन मॉड्यूल के बीच संसाधनों को साझा करने के तरीके पर संदेह है।

मान लें कि मेरे पास एक मॉड्यूल था जिसमें से मैं डेटाबेस से सभी कनेक्शन कर रहा था, और निश्चित रूप से सभी वर्ग/विधियां डीबी कर्सर (मैं SQLite का उपयोग कर रहा हूं) को संग्रहीत चर साझा कर रहा था। अब, विभिन्न मॉड्यूल में, उन्हें कर्सर को भी साझा करना होगा।

Graphical representation of dependences

तो, मेरे विचारों:

  • प्रत्येक मॉड्यूल में वैश्विक चर घोषित करें। लेकिन ग्लोबल्स बुरा हैं, बच्चों को खाएं और अपनी नौकरी चुराएं। तो मुझे नहीं पता कि यह जाने का रास्ता है या नहीं।

    '''Sub Module 1''' 
    
    global database_cursor 
    
  • आयात मूल database_cursor साथ "पिता" database_module और प्रयोग कुछ इस तरह:

    '''Sub Module 1''' 
    
    db_cursor = database_module.database_cursor 
    

यह दूसरा इस मामले में ठीक लग रहा है, लेकिन मैं कई मामलों का नेतृत्व करेंगे में लगता है आयात करने के लिए आयात, जो मुझे लगता है कि यह बचने के लिए कुछ है।

+0

मुझे लगता है कि आप [overengineering] हो सकते हैं (http://en.wikipedia.org/wiki/Overengineering)। यदि कार्यों को काम करने के लिए कर्सर की आवश्यकता होती है तो बस कार्यों में पैरामीटर 'कर्सर' जोड़ें और आप कर चुके हैं। कोड जो सभी फ़ंक्शन को कॉल करता है, एक स्थानीय वैरिएबल बना देगा जिसमें कर्सर होता है और इसे सभी कार्यों में पास करता है। साथ ही, मैं कहूंगा कि डेटाबेस प्रबंधन के लिए एक एकल मॉड्यूल पर्याप्त है। यदि आपको लगता है कि आपको अधिक संगठन की आवश्यकता है तो आप 'SQLAlchemy' जैसी चीज़ों का बेहतर उपयोग कर रहे हैं। – Bakuriu

+0

मुझे नहीं लगता कि यह इंजीनियरिंग खत्म हो गया है। अनावश्यक पुनर्नवीनीकरण से बचने के लिए डेटाबेस कनेक्शन जैसी चीज़ों को साझा करना पूरी तरह से वैध है। हालांकि मुझे लगता है कि इसके लिए कनेक्शन पूलिंग देखना बुद्धिमानी है। अन्यथा आपको पिछली कॉल से अभी भी कनेक्शन में कनेक्शन के साथ समस्याएं मिलती हैं। – RickyA

उत्तर

7

आपकी दूसरी विधि जाने का तरीका है। पाइथन आयात प्रकृति द्वारा सिंगलटन हैं। जब एक मॉड्यूल कई बार आयात किया जाता है तो इसे केवल पहली बार निष्पादित किया जाता है। बाद के आयात ग्लोबल्स से मॉड्यूल ऑब्जेक्ट उदाहरण प्राप्त करते हैं। उस here पर और अधिक।

shared.py:

class Shared: 
    def __init__(self): 
     print("Init shared") 

    def do_stuff(self, from_mod): 
     print("Do stuff from {0}. I am instance {1}".format(from_mod, self)) 

shared = Shared() 

foo.py

import shared 

shared.shared.do_stuff("foo") 

bar.py

import foo 
import shared 

shared.shared.do_stuff("bar") 

हम bar.py पर अमल तो हम पाते हैं:

>>> Init shared 
>>> Do stuff from foo. I am instance <shared.Shared instance at 0x10046df38> 
>>> Do stuff from bar. I am instance <shared.Shared instance at 0x10046df38> 

तो अपने मामले में आप कहीं भी database_module को संदर्भित कर सकते हैं और यह केवल एक बार शुरू होता है, इसलिए प्रभावी रूप से आपके कनेक्शन को साझा करना।

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