網站首頁 編程語言 正文
前言
在Python工程中,我們經常可以看到帶有“__init__.py”文件的目錄,在PyCharm中,帶有這個文件的目錄被認為是Python的包目錄,與目錄的圖標有不一樣的顯示。如下圖所示, dir_example是一個空白目錄,圖標是個文件夾圖標,而init_example下有_init__.py文件,其圖標是一個包。
那么這個文件的作用是什么,我們平時如何使用呢?
一、__init__.py文件簡介
Python 定義了兩種類型的包,常規包和命名空間包。常規包是傳統的包,因為它們存在于 Python 3.2 和更早的版本中。一個常規包通常被實現為一個包含__init__.py 文件的目錄。當一個常規包被導入時,這個__init__.py文件被隱式執行,它所定義的對象被綁定到包的名字空間中。
這是Python官方文檔中對__init__.py文件的描述,其實它的意思很簡單,就是說Python文件都是按照目錄當作不同的模塊來組織的,這個目錄被認為是Python包目錄,Python會通過搜索該目錄下的文件來導入相關的模塊。但是并不是所有的目錄都會被搜索添加,只有當目錄中包含__init__.py文件時,這個目錄才會被Python當作是一個包目錄,進而搜索添加里面的文件。這樣做可以讓編程者自己控制哪些目錄可以被Python導入成包。
當某個目錄中包含__init__.py文件時,Python在引入這個模塊之前,會首先執行這個文件。因此,這個文件也可以被編程者用來控制定義包級別的變量。
綜上所述,__init__.py文件最主要的作用是2個:
當目錄下包含這個文件時,Python會將其當作成包目錄,進而可以使用import xx.xx的方式導入目錄下的文件或者模塊。
使用__init__.py文件可以控制模塊導入時的變量和內容,便于編程者的控制。
下面我們看幾個例子即可。
二、__init__.py文件的使用案例
2.1、沒有__init__.py文件的目錄,使用import xx.xx會報錯嗎?
看版本,在較低的版本中(如3.2及以下),沒有__init__.py文件的目錄不能使用import xx.xx導入相關模塊,但是后面的版本可以。
2.2、在__init__.py文件中定義變量或者邏輯將在導入時候被執行
例如,我們有如下的目錄結構:
init_example/ a_pkg/
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?__init__.py
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? a.py
? ? ? ? ? ? ? ? ? ?init_test.py
即init_example工程下有個init_test.py文件和a_pkg目錄,a_pkg目錄下有__init__.py文件和一個a.py文件。
我們在a_pkg目錄下的__init__.py文件定義:
print("Hey, I am a __init__.py file")
那么,如果我們在init_test.py中內容如下:
from a_pkg import *
執行init_test.py我們可以得到如下結果:
Hey, I am a __init__.py file
因為在from a_pkg import *時候,會首先執行a_pkg目錄下的__init__.py文件。
2.3、在__init__.py文件中定義變量或者方法,可以被直接導入使用
還是上面的目錄,假如我們在a_pkg目錄下的a.py定義如下內容:
def a_method():
? ? ? ? print("I am a_pkg!")
在a_pkg目錄下的__init__.py文件定義:
from a_pkg.a import a_method
那么,我們在init_test.py中引入a_pkg可以直接引入a_method方法:
from init_example.a_pkg import a_method a_method()
會打印如下內容:
I am a_pkg!
2.4、在__init__.py文件中使用__all__方法
__all__方法可以在__init__.py文件定義一些包或者變量,可以在使用
from init_example.a_pkg import *
時定義*表達的內容。
例如還是上面的內容,但是我們在a_pkg目錄下的__init__.py文件定義:
__all__ = ["a"]
那么,我們在init_test.py中使用下面的語句可以引入a模塊:
from a_pkg import *
a.a_method()
這時候依然會打印如下內容:
I am a_pkg!
總結
原文鏈接:https://blog.csdn.net/Kwoky/article/details/120870434
相關推薦
- 2022-04-01 SQL?Server?Transact-SQL編程詳解_MsSql
- 2022-01-31 (數據)圖像預處理——image augmentation圖像增廣之cutout、Mixup、Cut
- 2022-10-17 django如何根據現有數據庫表生成model詳解_python
- 2022-05-20 Modscan和Modsim 兩種Modbus調試工具使用說明
- 2022-02-19 數據結構C語言鏈表的實現介紹_C 語言
- 2022-07-12 Oracle 19c 創建和遷移PDB的幾種方式
- 2023-07-09 css樣式重疊解決辦法
- 2022-08-20 Python簡明講解filter函數的用法_python
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支