Hướng dẫn what is __ init __ file in python? - tệp __ init __ trong python là gì?

Đã hỏi 13 năm, 9 tháng trước 13 years, 9 months ago

Đã xem 2,0m lần 2.0m times

3365

Mới! Lưu câu hỏi hoặc câu trả lời và sắp xếp nội dung yêu thích của bạn. Tìm hiểu thêm.
Learn more.

import spam
5 cho trong thư mục nguồn Python là gì?

Hướng dẫn what is __ init __ file in python? - tệp __ init __ trong python là gì?

Mateen Ulhaq

22.3K16 Huy hiệu vàng86 Huy hiệu bạc127 Huy hiệu đồng16 gold badges86 silver badges127 bronze badges

hỏi ngày 15 tháng 1 năm 2009 lúc 20:09Jan 15, 2009 at 20:09

6

Nó từng là một phần bắt buộc của gói (gói cũ, trước 3,3 "thường xuyên", không phải là "gói tên gọi tên" mới hơn 3,3+).

Đây là tài liệu.

Python xác định hai loại gói, gói thông thường và gói tên. Các gói thông thường là các gói truyền thống khi chúng tồn tại trong Python 3.2 trở lên. Một gói thông thường thường được triển khai dưới dạng thư mục chứa tệp

import spam
5. Khi một gói thông thường được nhập, tệp
import spam
5 này được thực thi hoàn toàn và các đối tượng mà nó xác định bị ràng buộc với tên trong không gian tên gói. Tệp
import spam
5 có thể chứa cùng một mã Python mà bất kỳ mô -đun nào khác có thể chứa và Python sẽ thêm một số thuộc tính bổ sung vào mô -đun khi được nhập.

Nhưng chỉ cần nhấp vào liên kết, nó chứa một ví dụ, thêm thông tin và giải thích về các gói không gian tên, loại gói mà không có

import spam
5.

SMCI

30.7K18 Huy hiệu vàng110 Huy hiệu bạc145 Huy hiệu đồng18 gold badges110 silver badges145 bronze badges

Đã trả lời ngày 15 tháng 1 năm 2009 lúc 20:13Jan 15, 2009 at 20:13

LokilokiLoki

28.9K9 Huy hiệu vàng47 Huy hiệu bạc62 Huy hiệu Đồng9 gold badges47 silver badges62 bronze badges

4

Các tệp có tên

import spam
5 được sử dụng để đánh dấu các thư mục trên đĩa là thư mục gói Python. Nếu bạn có các tệp

mydir/spam/__init__.py
mydir/spam/module.py

database/
    __init__.py
    schema.py
    insertions.py
    queries.py
1 là trên đường dẫn của bạn, bạn có thể nhập mã trong
database/
    __init__.py
    schema.py
    insertions.py
    queries.py
2 dưới dạng

import spam.module

hoặc

from spam import module

Nếu bạn xóa tệp

import spam
5, Python sẽ không còn tìm kiếm các mô hình con bên trong thư mục đó, vì vậy cố gắng nhập mô -đun sẽ không thành công.

Tệp

import spam
5 thường trống, nhưng có thể được sử dụng để xuất các phần được chọn của gói dưới tên thuận tiện hơn, giữ các hàm tiện lợi, v.v.

import spam

dựa vào cái này

Shaido

26.5K21 Huy hiệu vàng68 Huy hiệu bạc71 Huy hiệu đồng21 gold badges68 silver badges71 bronze badges

Đã trả lời ngày 7 tháng 11 năm 2010 lúc 3:31Nov 7, 2010 at 3:31

Caritoscaritoscaritos

Huy hiệu vàng 12k22 gold badges16 silver badges15 bronze badges

3

Ngoài việc dán nhãn thư mục là gói Python và xác định

database/
    __init__.py
    schema.py
    insertions.py
    queries.py
5,
import spam
5 cho phép bạn xác định bất kỳ biến nào ở cấp gói. Làm như vậy thường thuận tiện nếu một gói định nghĩa một cái gì đó sẽ được nhập thường xuyên, theo kiểu giống như API. Mô hình này thúc đẩy việc tuân thủ các "căn hộ" tốt hơn triết lý lồng nhau ".
import spam
5 allows you to define any variable at the package level.
Doing so is often convenient if a package defines something that will be imported frequently, in an API-like fashion. This pattern promotes adherence to the Pythonic "flat is better than nested" philosophy.

Một ví dụ

Dưới đây là một ví dụ từ một trong các dự án của tôi, trong đó tôi thường xuyên nhập

database/
    __init__.py
    schema.py
    insertions.py
    queries.py
7 gọi là
database/
    __init__.py
    schema.py
    insertions.py
    queries.py
8 để tương tác với cơ sở dữ liệu của mình. Tôi đã viết gói "cơ sở dữ liệu" với một vài mô -đun:

database/
    __init__.py
    schema.py
    insertions.py
    queries.py

import spam
5 của tôi chứa mã sau:

import os

from sqlalchemy.orm import sessionmaker
from sqlalchemy import create_engine

engine = create_engine(os.environ['DATABASE_URL'])
Session = sessionmaker(bind=engine)

Vì tôi xác định

database/
    __init__.py
    schema.py
    insertions.py
    queries.py
8 ở đây, tôi có thể bắt đầu một phiên mới bằng cú pháp dưới đây. Mã này sẽ giống nhau được thực hiện từ bên trong hoặc bên ngoài thư mục gói "cơ sở dữ liệu".

from database import Session
session = Session()

Tất nhiên, đây là một sự tiện lợi nhỏ - thay thế sẽ là xác định

database/
    __init__.py
    schema.py
    insertions.py
    queries.py
8 trong một tệp mới như "create_session.py" trong gói cơ sở dữ liệu của tôi và bắt đầu các phiên mới bằng cách sử dụng:

from database.create_session import Session
session = Session()

đọc thêm

Có một chủ đề Reddit khá thú vị bao gồm các ứng dụng thích hợp của

import spam
5 tại đây:

http://www.reddit.com/r/Python/comments/1bbbwk/whats_your_opinion_on_what_to_include_in_init_py/

Ý kiến ​​đa số dường như là các tệp

import spam
5 nên rất mỏng để tránh vi phạm "rõ ràng tốt hơn so với triết lý ngầm".

Đã trả lời ngày 24 tháng 9 năm 2013 lúc 10:38Sep 24, 2013 at 10:38

Hướng dẫn what is __ init __ file in python? - tệp __ init __ trong python là gì?

Nathan Gouldnathan GouldNathan Gould

7.5652 Huy hiệu vàng16 Huy hiệu bạc15 Huy hiệu Đồng2 gold badges16 silver badges15 bronze badges

3

Có 2 lý do chính cho

import spam
5

  1. Để thuận tiện: Người dùng khác sẽ không cần biết vị trí chính xác của chức năng của bạn trong hệ thống phân cấp gói (tài liệu) của bạn.

    your_package/
      __init__.py
      file1.py
      file2.py
        ...
      fileN.py
    
    # in __init__.py
    from .file1 import *
    from .file2 import *
    ...
    from .fileN import *
    
    import spam.module
    
    0

    sau đó những người khác có thể gọi thêm () bởi

    import spam.module
    
    1

    mà không biết các chức năng bên trong của File1, như

    import spam.module
    
    2
  2. Nếu bạn muốn một cái gì đó được khởi tạo; Ví dụ: ghi nhật ký (nên được đặt ở cấp cao nhất):

    import spam.module
    
    3

Rajat Jain

1.2632 huy hiệu vàng15 Huy hiệu bạc28 Huy hiệu đồng2 gold badges15 silver badges28 bronze badges

Đã trả lời ngày 8 tháng 4 năm 2015 lúc 8:29Apr 8, 2015 at 8:29

flyceflyceeflycee

10,9k3 Huy hiệu vàng18 Huy hiệu bạc14 Huy hiệu đồng3 gold badges18 silver badges14 bronze badges

3

Tệp

import spam
5 làm cho các thư mục xử lý Python chứa nó dưới dạng các mô -đun.

Hơn nữa, đây là tệp đầu tiên được tải trong một mô -đun, vì vậy bạn có thể sử dụng nó để thực thi mã mà bạn muốn chạy mỗi khi một mô -đun được tải hoặc chỉ định các mô hình con được xuất.

Đã trả lời ngày 15 tháng 1 năm 2009 lúc 20:22Jan 15, 2009 at 20:22

Berk Güdercan có thể Berk GüderCan Berk Güder

106K25 Huy hiệu vàng129 Huy hiệu bạc136 Huy hiệu đồng25 gold badges129 silver badges136 bronze badges

2

Vì Python 3.3,

import spam
5 không còn cần phải xác định các thư mục là các gói Python có thể nhập.

Kiểm tra PEP 420: Gói không gian tên ngầm:

Hỗ trợ bản địa cho các thư mục gói mà don lồng yêu cầu các tệp đánh dấu

import spam
5 và có thể tự động mở rộng nhiều phân đoạn đường dẫn (lấy cảm hứng từ các cách tiếp cận của bên thứ ba khác nhau đối với các gói không gian tên, như được mô tả trong PEP 420)

Đây là bài kiểm tra:

import spam.module
4

Tài liệu tham khảo: https://docs.python.org/3/whatsnew/3.3.html#pep-420-implicit-maces PY không cần thiết cho các gói trong Python 3?
https://docs.python.org/3/whatsnew/3.3.html#pep-420-implicit-namespace-packages
https://www.python.org/dev/peps/pep-0420/
Is __init__.py not required for packages in Python 3?

Đã trả lời ngày 12 tháng 10 năm 2016 lúc 6:36Oct 12, 2016 at 6:36

zeekvfuzeekvfuzeekvfu

3.2671 Huy hiệu vàng20 Huy hiệu bạc18 Huy hiệu đồng1 gold badge20 silver badges18 bronze badges

3

Mặc dù Python hoạt động mà không có tệp

import spam
5, bạn vẫn nên bao gồm một tệp.

Nó chỉ định rằng thư mục nên được coi là một gói, do đó bao gồm nó (ngay cả khi nó trống).

Ngoài ra còn có một trường hợp bạn thực sự có thể sử dụng tệp

import spam
5:

Hãy tưởng tượng bạn đã có cấu trúc tệp sau:

import spam.module
5

from database import Session
session = Session()
0 chứa điều này:

import spam.module
6

Để sử dụng

from database import Session
session = Session()
1, bạn sẽ cần một trong những điều sau đây:

import spam.module
7

Có thể ở đó bạn cần (hoặc muốn) giữ

from database import Session
session = Session()
0 bên trong
from database import Session
session = Session()
3 (ví dụ: Runtimes/Sextences) nhưng bạn chỉ muốn nhập
from database import Session
session = Session()
3.


Nếu bạn đã thay đổi tên của

from database import Session
session = Session()
0 thành
import spam
5 thì bạn có thể sử dụng
from database import Session
session = Session()
1 bằng cách chỉ nhập
from database import Session
session = Session()
3:

import spam.module
8

Điều này hoạt động vì

import spam
5 được coi là một phần của gói.


Một số gói Python thực sự làm điều này. Một ví dụ là với JSON, trong đó chạy

from database.create_session import Session
session = Session()
0 thực sự đang nhập
import spam
5 từ gói
from database.create_session import Session
session = Session()
2 (xem cấu trúc tệp gói ở đây):

Mã nguồn:

from database.create_session import Session
session = Session()
3
from database.create_session import Session
session = Session()
3

Hướng dẫn what is __ init __ file in python? - tệp __ init __ trong python là gì?

Đã trả lời ngày 12 tháng 5 năm 2018 lúc 15:41May 12, 2018 at 15:41

Hướng dẫn what is __ init __ file in python? - tệp __ init __ trong python là gì?

XantiumxantiumXantium

10,6K10 Huy hiệu vàng58 Huy hiệu bạc87 Huy hiệu đồng10 gold badges58 silver badges87 bronze badges

Trong Python, định nghĩa của gói rất đơn giản. Giống như Java, cấu trúc phân cấp và cấu trúc thư mục là như nhau. Nhưng bạn phải có

import spam
5 trong một gói. Tôi sẽ giải thích tệp
import spam
5 với ví dụ dưới đây:

import spam.module
9

import spam
5 có thể trống, miễn là nó tồn tại. Nó chỉ ra rằng thư mục nên được coi là một gói. Tất nhiên,
import spam
5 cũng có thể đặt nội dung thích hợp.

Nếu chúng ta thêm một hàm trong module_n1:

from spam import module
0

Sau khi chạy:

from spam import module
1

Sau đó, chúng tôi làm theo gói phân cấp và được gọi là MODULE_N1 hàm. Chúng ta có thể sử dụng

import spam
5 trong Subpackage_B như thế này:

from spam import module
2

Sau khi chạy:

from spam import module
3

Do đó, sử dụng * nhập, gói mô -đun phải tuân theo nội dung

import spam
5.

Đã trả lời ngày 9 tháng 1 năm 2014 lúc 11:45Jan 9, 2014 at 11:45

Marcus Thorntonmarcus ThorntonMarcus Thornton

5.7095 Huy hiệu vàng46 Huy hiệu bạc48 Huy hiệu đồng5 gold badges46 silver badges48 bronze badges

2

import spam
5 sẽ coi thư mục nó là một mô -đun có thể tải.

Đối với những người thích đọc mã, tôi đặt bình luận của nhà giả kim hai bit ở đây.

from spam import module
4

Đã trả lời ngày 3 tháng 1 năm 2015 lúc 17:41Jan 3, 2015 at 17:41

Hướng dẫn what is __ init __ file in python? - tệp __ init __ trong python là gì?

B.Mr.W.B.Mr.W.B.Mr.W.

18.1K33 Huy hiệu vàng111 Huy hiệu bạc166 Huy hiệu đồng33 gold badges111 silver badges166 bronze badges

0

Nó tạo điều kiện nhập các tệp Python khác. Khi bạn đặt tệp này vào một thư mục (nói) chứa các tệp PY khác, thì bạn có thể làm một cái gì đó như nhập công cụ.

from spam import module
5

Nếu không có

import spam
5 bên trong các công cụ thư mục, bạn không thể nhập bản khác, vì Python không biết mã nguồn cho công cụ ở đâu và không thể nhận ra nó là một gói.

Matt Fenwick

47.3K21 Huy hiệu vàng125 Huy hiệu bạc190 Huy hiệu Đồng21 gold badges125 silver badges190 bronze badges

Đã trả lời ngày 15 tháng 1 năm 2009 lúc 20:18Jan 15, 2009 at 20:18

EpitaphePitaphEpitaph

3.06810 Huy hiệu vàng33 Huy hiệu bạc43 Huy hiệu đồng10 gold badges33 silver badges43 bronze badges

0

Một tệp

import spam
5 giúp nhập khẩu dễ dàng. Khi có
import spam
5 có trong gói, chức năng
your_package/
  __init__.py
  file1.py
  file2.py
    ...
  fileN.py
4 có thể được nhập từ tệp
your_package/
  __init__.py
  file1.py
  file2.py
    ...
  fileN.py
5 như vậy:

from spam import module
6

Tuy nhiên, không có nó, bạn không thể nhập trực tiếp. Bạn phải sửa đổi đường dẫn hệ thống:

from spam import module
7

Đã trả lời ngày 25 tháng 5 năm 2019 lúc 2:42May 25, 2019 at 2:42

Hướng dẫn what is __ init __ file in python? - tệp __ init __ trong python là gì?

AlecalecAlec

7.5487 Huy hiệu vàng30 Huy hiệu bạc57 Huy hiệu Đồng7 gold badges30 silver badges57 bronze badges

0

Một điều __init__.py cho phép chuyển đổi một mô -đun thành một gói mà không phá vỡ API hoặc tạo không gian tên lồng nhau hoặc các mô -đun riêng*. Điều này giúp khi tôi muốn mở rộng một không gian tên.

Nếu tôi có một tệp Util.py chứa

from spam import module
8

sau đó người dùng sẽ truy cập

your_package/
  __init__.py
  file1.py
  file2.py
    ...
  fileN.py
6 với

from spam import module
9

Nếu sau đó tôi muốn thêm các chức năng tiện ích cho tương tác cơ sở dữ liệu và tôi muốn chúng có không gian tên riêng của chúng theo

your_package/
  __init__.py
  file1.py
  file2.py
    ...
  fileN.py
7, tôi sẽ cần một thư mục mới ** và để giữ khả năng tương thích API (để
your_package/
  __init__.py
  file1.py
  file2.py
    ...
  fileN.py
8 vẫn hoạt động), tôi sẽ Gọi nó là UTIL/. Tôi có thể chuyển Util.py vào Util/ Like SO,

import spam
0

và trong Util/__ init__.py do

import spam
1

Nhưng điều này là dư thừa. Thay vì có tệp UTIL/UTIL.PY, chúng ta chỉ có thể đặt nội dung Util.py vào __init__.py và người dùng có thể bây giờ có thể

import spam
2

Tôi nghĩ rằng điều này nổi bật một cách độc đáo cách

your_package/
  __init__.py
  file1.py
  file2.py
    ...
  fileN.py
7 của gói __init__.py hoạt động theo cách tương tự như mô -đun
your_package/
  __init__.py
  file1.py
  file2.py
    ...
  fileN.py
7

* Điều này được gợi ý trong các câu trả lời khác, nhưng tôi muốn làm nổi bật nó ở đây ** Không sử dụng thể dục dụng cụ nhập khẩu. Lưu ý rằng nó sẽ không hoạt động để tạo một gói mới có cùng tên với tệp, xem cái này
** short of employing import gymnastics. Note it won't work to create a new package with the same name as the file, see this

Đã trả lời ngày 19 tháng 7 năm 2020 lúc 21:37Jul 19, 2020 at 21:37

Joeljoeljoel

5.4482 Huy hiệu vàng30 Huy hiệu bạc46 Huy hiệu Đồng2 gold badges30 silver badges46 bronze badges

2

Nếu bạn đang sử dụng Python 2 và muốn tải anh chị em của tệp của mình, bạn chỉ cần thêm thư mục chính của tệp vào đường dẫn hệ thống của bạn. Nó sẽ hoạt động giống như khi tệp hiện tại của bạn là một tệp init.

import spam
3

Sau đó, nhập khẩu thường xuyên liên quan đến thư mục của tệp sẽ hoạt động tốt. Ví dụ.

import spam
4

Mặc dù vậy, bạn muốn sử dụng tệp init.py thích hợp, nhưng khi xử lý mã di sản, bạn có thể bị mắc kẹt với F.EX. Một thư viện được mã hóa cứng để tải một tệp cụ thể và không có gì ngoài. Đối với những trường hợp đó là một thay thế.init.py file instead though, but when dealing with legacy code you might be stuck with f.ex. a library hard-coded to load a particular file and nothing but. For those cases this is an alternative.

Đã trả lời ngày 14 tháng 7 lúc 13:24Jul 14 at 13:24

init.py: Đây là một tệp Python được tìm thấy trong thư mục gói, nó được gọi khi gói hoặc mô -đun trong gói được nhập. Bạn có thể sử dụng điều này để thực thi mã khởi tạo gói, tức là bất cứ khi nào gói được nhập, các câu lệnh Python được thực thi trước khi các mô -đun khác trong thư mục này được thực thi. Nó tương tự như chức năng chính của chương trình C hoặc Java nhưng điều này tồn tại trong mô -đun gói Python (thư mục) thay vì trong tệp Python cốt lõi. Ngoài ra, nó có quyền truy cập vào các biến toàn cầu được xác định trong tệp init.py này như khi mô -đun được nhập vào tệp Python..py : It is a python file found in a package directory, it is invoked when the package or a module in the package is imported. You can use this to execute package initialization code, i.e. whenever the package is imported the python statements are executed first before the other modules in this folder gets executed. It is similar to main function of c or java program but this exists in the python package module(folder) rather than in the core python file. also it has access to global variables defined in this init.py file as when the module is imported into python file.

ví dụ như ví dụ. Tôi có một tệp init.py trong một thư mục có tên pymodlib, tệp này chứa các câu lệnh sau:init.py file in a folder called pymodlib, this file contains the following statements:

in (f'invoking init.py cho {name} ') pystructure = [' for_loop ',' while__loop ',' ifcondition ']]]]init.py for {name}') pystructures = ['for_loop', 'while__loop', 'ifCondition']

Khi tôi nhập gói này "pymodlib" trong mô -đun giải pháp hoặc bảng điều khiển Python của giải pháp của tôi: hai câu lệnh này được thực thi trong khi nhập. Vì vậy, trong nhật ký hoặc bảng điều khiển, bạn sẽ thấy đầu ra sau:

Nhập pymodlib gọi init.py cho pymodlibinit.py for pymodlib

Trong tuyên bố tiếp theo của bảng điều khiển Python: Tôi có thể truy cập biến toàn cầu:

pymodlib.pystructure Nó cung cấp cho đầu ra sau:

['for_loop', 'trong khi__Loop', 'ifcondition']]]

Bây giờ từ Python3.3 trở đi, việc sử dụng tệp này là tùy chọn để biến thư mục thành một mô -đun Python. Vì vậy, bạn bỏ qua từ bao gồm nó trong thư mục mô -đun Python.

Đã trả lời ngày 4 tháng 4 lúc 18:35Apr 4 at 18:35

Mục đích của tệp __ init __ py tại thời điểm tạo các gói python là gì?

Nếu một tệp có tên __init__.py có trong thư mục gói, nó sẽ được gọi khi gói hoặc mô -đun trong gói được nhập. Bạn có thể sử dụng điều này để thực hiện mã khởi tạo gói, ví dụ để khởi tạo dữ liệu cấp gói.to execute package initialization code, for example for the initialization of package-level data.

Việc sử dụng tệp __ init __ py trong một gói là gì ngay cả khi nó trống?

Mục đích duy nhất của __init__.py là để chỉ ra rằng thư mục chứa tệp này là một gói và để coi thư mục này là gói, đó là lý do tại sao nó được khuyến nghị để trống.to indicate that the folder containing this file is a package, and to treat this folder as package, that's why it is recommended to leave it empty.

Mục đích của __ init __ py trong các thư mục dự án là gì?

Tệp __init__.py cho phép trình thông dịch Python biết rằng một thư mục chứa mã cho mô -đun Python.Một tệp __init__.py có thể trống.Không có một, bạn không thể nhập các mô -đun từ một thư mục khác vào dự án của bạn.Vai trò của tệp __init__.py tương tự như hàm __init__ trong lớp Python.lets the Python interpreter know that a directory contains code for a Python module. An __init__.py file can be blank. Without one, you cannot import modules from another folder into your project. The role of the __init__.py file is similar to the __init__ function in a Python class.

Tôi đặt gì trong một tập tin init?

Điều tối thiểu nhất cần làm là để lại tệp __init__.py hoàn toàn trống.Di chuyển một chút ra khỏi điều này, trong khi vẫn giữ mọi thứ đơn giản, bạn chỉ có thể sử dụng __init__.py để xác định đơn hàng nhập.Một bước khác trên phổ, bạn có thể sử dụng tệp __init__.py để xác định API của gói.determining import order. Another step up on the spectrum, you can use the __init__.py file to define the API of the package.