2012-11-30 20 views
6

Kodumu yeniden düzenliyorum ve bu nedenle yeni ad alanları oluşturuyorum. Modüller için "statik" sınıfları (her bir yöntemde @staticmethod sınıfları) değiştiriyorum. Bu gitmek için yol değil mi? Sorun, bu modüller arasında kaynakların nasıl paylaşılacağı konusunda şüphelerim olmasıdır.Modüller arasında iyi uygulama paylaşımı kaynakları?

Veritabanına tüm bağlantıları yaptığım bir modülüm olduğunu ve elbette tüm sınıfların/yöntemlerin DB imlecini (SQLite kullanıyorum) depolayan değişkeni paylaştığını varsayalım. Şimdi, farklı modüllerde, imleci de paylaşmak zorundalar.

Graphical representation of dependences

Yani, benim fikirlerim:

  • her modülde küresel değişken bildirin. Ama küreler kötüler, çocukları yerler ve işimizi çalıyorlar. Yani, bunun yolun olup olmadığını bilmiyorum. Böyle

    '''Sub Module 1''' 
    
    global database_cursor 
    
  • İthalat orijinal database_cursor ile "baba" database_module ve kullanımı şey:

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

Bu ikinci bu durumda iyi görünüyor, ama ben götürecek birçok durumda düşünüyorum Yinelemek için bir şey olduğunu sanıyorum yinelemeli ithalat için.

+0

Sanırım [aşırı mühendislik] olabilirsiniz (http://en.wikipedia.org/wiki/Overengineering). Fonksiyonlar üzerinde çalışmak için bir imleç gerekiyorsa, fonksiyonlara 'cursor' parametresini ekleyin ve işiniz bitti. Tüm işlevi çağıran kod, imleci içeren ve tüm işlevlere ileten tek bir yerel değişken oluşturacaktır. Ayrıca veritabanı yönetimi için tek bir modül yeterli olduğunu söyleyebilirim. Daha fazla organizasyona ihtiyacınız olduğunu bulursanız, SQLAlchemy' gibi bir şey kullanmanız daha iyi olur. – Bakuriu

+0

Bunun mühendislik üzerinde olduğunu sanmıyorum. Gereksiz yeniden ilkelemeden kaçınmak için veritabanı bağlantıları gibi şeyleri paylaşmak mükemmel bir yasaldır. Ancak bunun için bağlantı havuzuna bakmanın akıllıca olduğunu düşünüyorum. Aksi halde, daha önceki bir aramada hala kullanımda olan bağlantı ile ilgili problemler yaşarsınız. – RickyA

cevap

7

İkinci yönteminiz gitmek için bir yoldur. Python ithalatları doğaya göre tekildir. Bir modül birden çok kez içe aktarıldığında sadece ilk kez çalıştırılır. Sonraki ithalatlar, modül nesne örneğini globals'tan alır. Daha fazla 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 biz bar.py yürütmek durumunda

import foo 
import shared 

shared.shared.do_stuff("bar") 

elde ederiz:

>>> 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> 

Bu durumda, istediğiniz her yerden database_module numarasına başvurabilir ve sadece bir kez başlatılır, böylece bağlantınızı etkili bir şekilde paylaşabilirsiniz.

İlgili konular