2010-03-02 53 views
60

Tôi gặp khó khăn trong việc hiểu các tình huống sử dụng hoặc mục tiêu thiết kế của các tệp __init__.py của python trong các dự án của tôi.sử dụng __init__.py

Giả sử rằng tôi có 'mô hình' thư mục (ám chỉ như là một gói), trong đó có các tập tin sau đây

  1. __init__.py
  2. meta.py
  3. solrmodel.py
  4. mongomodel.py
  5. samodel.py

tôi thấy hai cách sử dụng __init__.py:

  1. tôi có chung một định nghĩa mà cần phải được sử dụng trong solrmodel.py, mongomodel.py, samodel.py. Tôi có thể sử dụng __init__.py làm định nghĩa cơ sở/phổ biến cho tất cả các lớp * model.py không? Điều này có nghĩa là tôi phải nhập model/__init__.py.

  2. Hoặc, các __init__.py trách nhiệm đã nhập khẩu các định nghĩa của solrmodel.py, mongomodel.py, samodel.py ở riêng của mình và nó cho phép việc nhập khẩu dễ dàng của các lớp học hoặc chức năng như thế này:

    # file: __init__.py 
    
    from mongomodel import * 
    from solrmodel import * 
    from samodel import * 
    

    (Tôi ý thức rằng import * không được khuyến nghị và tôi chỉ sử dụng nó làm quy ước)

Tôi không thể quyết định giữa hai trường hợp trên. Có nhiều tình huống sử dụng hơn cho __init__.py và bạn có thể giải thích cách sử dụng không?

+1

Dường như stackoverflow có vấn đề trong hiển thị đánh dấu. trong khi chỉnh sửa nó cho thấy \ __ init__.py nhưng trong khi hiển thị nó cho thấy _init_.py. Ai đó có thể sửa chữa quy ước \ __ init__.py không? –

+11

Sử dụng backticks để đặt nó vào một khối mã, như sau: '\' __init __. Py \ ''. hoặc sử dụng \ như '\\ _ \\ _ init \\ _ \\ _. py' cho \ _ \ _ init \ _ \ _. py. Dấu gạch dưới được sử dụng để in nghiêng. – Ponkadoodle

Trả lời

47

Phần lớn các tệp __init__.py tôi viết trống, vì nhiều gói không có bất kỳ thứ gì để khởi tạo.

Một ví dụ mà tôi có thể muốn khởi tạo là khi ở thời điểm tải gói tôi muốn đọc trong một loạt dữ liệu một lần và cho tất cả (từ tệp, DB hoặc web, nói) - trong trường hợp đó đó là nhiều hơn đẹp hơn khi đọc trong một chức năng riêng trong gói __init__.py thay vì có một mô-đun khởi tạo riêng biệt và nhập khẩu mô-đun đó từ mọi mô-đun thực trong gói (vô dụng lặp lại và dễ bị lỗi) trường hợp phụ thuộc vào sự đảm bảo của ngôn ngữ rằng gói __init__.py được nạp một lần trước khi bất kỳ mô đun nào trong gói rõ ràng là nhiều hơn Pythonic!).

Đối với các biểu thức cụ thể và có thẩm quyền khác, hãy xem các phương pháp khác nhau được thực hiện trong các gói khác nhau là một phần của thư viện chuẩn của Python.

+2

Giá treo khuyên bạn nên đặt các mô hình bên trong __init__.py. Có được không? thực sự khởi tạo mô hình theo cách đó? –

+8

Cá nhân, tôi không muốn đặt mã đáng kể trong '__init __. py', nhưng không có lý do sâu sắc để tránh nó - nó hoàn toàn là một sự lựa chọn phong cách. Tất cả các mã trong tập tin đó được thực thi đầu tiên thời gian bạn nhập gói hoặc bất kỳ mô-đun nào từ gói. –

+0

Tôi có câu hỏi liên quan đến các biến toàn cầu trong chế độ xem Django. Vui lòng cung cấp chế độ xem của bạn? http://stackoverflow.com/questions/39490843/django-app-level- biến –

22

Nội dung của __init__.py được nhập khi bạn nhập mô-đun trong gói.

Bạn đang xem kịch bản thứ ba, đặt các phần chung vào một mô-đun riêng và sau đó nhập các mô-đun khác, để lại __init__.py cho những thứ sẽ được sử dụng bên ngoài gói. Đây là thực tế tôi thường làm theo.

+1

Tôi không hiểu lắm. Bạn có thể vui lòng cung cấp một ví dụ cho kịch bản thứ ba không? –

+3

@Tyler Long, ông có nghĩa là có một mô-đun khởi tạo riêng biệt (fe 'bootstrap' và gọi' import bootstrap' trong gói '__init __. Py'. – warvariuc

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