2012-11-30 27 views
6

Tôi đang sắp xếp lại mã của mình và do đó tạo các không gian tên mới. Tôi đang thay đổi các lớp "tĩnh" (các lớp có @staticmethod trong mỗi phương thức) cho các mô-đun. Đây là con đường để đi, phải không?Tài nguyên chia sẻ thực tiễn tốt giữa các mô-đun?

Vấn đề là tôi có nghi ngờ về cách chia sẻ tài nguyên giữa các mô-đun này.

Giả sử tôi có một mô-đun mà từ đó tôi đã thực hiện tất cả các kết nối đến cơ sở dữ liệu, và tất nhiên tất cả các lớp/phương thức đều chia sẻ biến lưu trữ con trỏ DB (tôi đang sử dụng SQLite). Bây giờ, trong các mô-đun khác nhau, họ cũng phải chia sẻ con trỏ.

Graphical representation of dependences

Vì vậy, ý tưởng của tôi:

  • Khai báo các biến toàn cầu trong mỗi module. Nhưng globals là ác, ăn trẻ em và ăn cắp công việc của chúng tôi. Vì vậy, tôi không biết nếu đây là con đường để đi.

    '''Sub Module 1''' 
    
    global database_cursor 
    
  • nhập "cha đẻ" database_module với database_cursor gốc và sử dụng một cái gì đó như thế này:

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

thứ hai này có vẻ tốt đẹp trong trường hợp này, nhưng tôi nghĩ rằng trong nhiều trường hợp sẽ dẫn để đệ quy nhập khẩu, mà tôi đoán đó là một cái gì đó để tránh.

+0

Tôi nghĩ bạn có thể [quá tải] (http://en.wikipedia.org/wiki/Overengineering). Nếu các hàm cần một con trỏ để làm việc trên chỉ cần thêm một tham số 'cursor' vào các hàm và bạn đã hoàn thành. Mã lệnh gọi tất cả các hàm sẽ tạo ra một biến cục bộ chứa con trỏ và truyền nó xung quanh đến tất cả các hàm. Ngoài ra, tôi muốn nói một mô-đun duy nhất để quản lý cơ sở dữ liệu là đủ. Nếu bạn thấy rằng bạn cần nhiều tổ chức hơn thì bạn nên sử dụng một cái gì đó như 'SQLAlchemy'. – Bakuriu

+0

Tôi không nghĩ đây là kỹ thuật. Nó là hoàn toàn hợp pháp để chia sẻ những thứ như kết nối cơ sở dữ liệu để tránh reinitialization không cần thiết. Tuy nhiên tôi nghĩ rằng nó là khôn ngoan để xem xét kết nối tổng hợp cho việc này. Nếu không, bạn có thể gặp sự cố với kết nối vẫn đang được sử dụng từ cuộc gọi trước đó. – RickyA

Trả lời

7

Phương pháp thứ hai của bạn là cách để đi. Việc nhập khẩu Python là tự nhiên. Khi một mô-đun được nhập nhiều lần, nó chỉ được thực hiện lần đầu tiên. Nhập khẩu tiếp theo tìm nạp cá thể đối tượng mô-đun từ các hình cầu. Thêm thông tin về số 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") 

Nếu chúng ta thực hiện bar.py chúng tôi nhận được:

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

Vì vậy, trong trường hợp của bạn, bạn có thể tham khảo database_module từ bất cứ nơi nào bạn muốn và nó được khởi tạo chỉ một lần, do đó có hiệu quả chia sẻ kết nối của bạn.

Các vấn đề liên quan