Python __init__.py 作用詳解

来源:http://www.cnblogs.com/Lands-ljk/archive/2016/09/18/5880483.html
-Advertisement-
Play Games

\_\_init\_\_.py 文件的作用是將文件夾變為一個Python模塊,Python 中的每個模塊的包中,都有\_\_init\_\_.py 文件。 通常\_\_init\_\_.py 文件為空,但是我們還可以為它增加其他的功能。我們在導入一個包時,實際上是導入了它的\_\_init\_\_. ...


__init__.py 文件的作用是將文件夾變為一個Python模塊,Python 中的每個模塊的包中,都有__init__.py 文件。

通常__init__.py 文件為空,但是我們還可以為它增加其他的功能。我們在導入一個包時,實際上是導入了它的__init__.py文件。這樣我們可以在__init__.py文件中批量導入我們所需要的模塊,而不再需要一個一個的導入。

# package
# __init__.py
import re
import urllib
import sys
import os

# a.py
import package 
print(package.re, package.urllib, package.sys, package.os)

註意這裡訪問__init__.py文件中的引用文件,需要加上包名。

__init__.py中還有一個重要的變數,__all__, 它用來將模塊全部導入。

# __init__.py
__all__ = ['os', 'sys', 're', 'urllib']

# a.py
from package import *

這時就會把註冊在__init__.py文件中__all__列表中的模塊和包導入到當前文件中來。

可以瞭解到,__init__.py主要控制包的導入行為。要想清楚理解__init__.py文件的作用,還需要詳細瞭解一下import語句引用機制:

可以被import語句導入的對象是以下類型:

  • 模塊文件(.py文件)
  • C或C++擴展(已編譯為共用庫或DLL文件)
  • 包(包含多個模塊)
  • 內建模塊(使用C編寫並已鏈接到Python解釋器中)

當導入模塊時,解釋器按照sys.path列表中的目錄順序來查找導入文件。

import sys
>>> print(sys.path)

# Linux:
['', '/usr/local/lib/python3.4',
 '/usr/local/lib/python3.4/plat-sunos5',
 '/usr/local/lib/python3.4/lib-tk',
 '/usr/local/lib/python3.4/lib-dynload',
 '/usr/local/lib/python3.4/site-packages']

# Windows:
['', 'C:\\WINDOWS\\system32\\python34.zip', 'C:\\Documents and Settings\\weizhong', 'C:\\Python34\\DLLs', 'C:\\Python34\\lib', 'C:\\Python34\\lib\\plat-win', 'C:\\Python34\\lib\\lib-tk', 'C:\\Python34\\Lib\\site-packages\\pythonwin', 'C:\\Python34', 'C:\\Python34\\lib\\site-packages', 'C:\\Python34\\lib\\site-packages\\win32', 'C:\\Python34\\lib\\site-packages\\win32\\lib', 'C:\\Python34\\lib\\site-packages\\wx-2.6-msw-unicode']

其中list第一個元素空字元串代表當前目錄。

關於.pyc 文件 與 .pyo 文件

.py文件的彙編,只有在import語句執行時進行,當.py文件第一次被導入時,它會被彙編為位元組代碼,並將位元組碼寫入同名的.pyc文件中。後來每次導入操作都會直接執行.pyc 文件(當.py文件的修改時間發生改變,這樣會生成新的.pyc文件),在解釋器使用-O選項時,將使用同名的.pyo文件,這個文件去掉了斷言(assert)、斷行號以及其他調試信息,體積更小,運行更快。(使用-OO選項,生成的.pyo文件會忽略文檔信息)

導入模塊

模塊通常為單獨的.py文件,可以用import直接引用,可以作為模塊的文件類型有.py、.pyo、.pyc、.pyd、.so、.dll

在導入模塊時,解釋器做以下工作:

  1. 已導入模塊的名稱創建新的命名空間,通過該命名空間就可以訪問導入模塊的屬性和方法。

  2. 在新創建的命名空間中執行源代碼文件。

  3. 創建一個名為源代碼文件的對象,該對象引用模塊的名字空間,這樣就可以通過這個對象訪問模塊中的函數及變數

import 語句可以在程式的任何位置使用,你可以在程式中多次導入同一個模塊,但模塊中的代碼僅僅在該模塊被首次導入時執行。後面的import語句只是簡單的創建一個到模塊名字空間的引用而已。

sys.modules字典中保存著所有被導入模塊的模塊名到模塊對象的映射。

導入包

多個相關聯的模塊組成一個包,以便於維護和使用,同時能有限的避免命名空間的衝突。一般來說,包的結構可以是這樣的:

package
  |- subpackage1
      |- __init__.py
      |- a.py
  |- subpackage2
      |- __init__.py
      |- b.py

有以下幾種導入方式:

import subpackage1.a # 將模塊subpackage.a導入全局命名空間,例如訪問a中屬性時用subpackage1.a.attr
from subpackage1 import a # 將模塊a導入全局命名空間,例如訪問a中屬性時用a.attr_a
from subpackage.a import attr_a # 將模塊a的屬性直接導入到命名空間中,例如訪問a中屬性時直接用attr_a

使用from語句可以把模塊直接導入當前命名空間,from語句並不引用導入對象的命名空間,而是將被導入對象直接引入當前命名空間。


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 項目需求: 某學校訂單截止操作時間的上一個月最後一天晚上23:59:59 為止所有支付的訂單統計; 代碼: 圖片: 利用DateTime.Parse();將string類型的時間轉換為datetime類型,我們看一下後面的代碼,是將時間手動的設置為我們需要的時間。 這樣我們設置了值。 封裝取時間的方 ...
  • 題目要求:用戶隨機輸入字母及數字組成的字元串,當用戶連續輸入字元串‘hello’時,程式結束用戶輸入,並分別顯示用戶輸入的字母及數字的數目。 代碼: 題目解析:首先這道題目要求用戶輸入字元串”hello“時結束輸入,不如分別判斷這五個字母,其次需要程式自動結束輸入,我們就需要用Console.Rea ...
  • 1.VirtrualBox安裝Centos6.8 minimal VirtrualBox新建個虛擬機配置好記憶體以及硬碟大小,安裝即可; 網路方式是 NAT(預設)和橋接方式來實現,最好在安裝前設置好,NAT主要是連外網,橋接可通過區域網IP訪問; 設置-網路-網卡1(NAT)預設已經設置好了,再點開 ...
  • 一年之前,我做夢也想不到會來這裡寫技術總結。誤打誤撞來到了上海西南某高校,成為了文科專業的工科男,現在每天除了膜ha,就是惡補CS。導師是做計算語言學的,所以當務之急就是先自學電腦自然語言處理,打好底子準備做科研(認真臉)。 進入正題,從圖書館找了本“Natural Language Proces ...
  • More is better Time Limit: 5000/1000 MS (Java/Others) Memory Limit: 327680/102400 K (Java/Others)Total Submission(s): 24825 Accepted Submission(s): 89 ...
  • 一、SpringAOP: ⒈AOP:Aspect Oriented Programming 面向切麵編程, 實現的是核心業務和非核心業務之間的的分離,讓核心類只做核心業務,代理類只做非核心業務。 ⒉目的: ⑴、把核心業務和非核心業務進行分離 ⑵、把多個非核心業務處理(點)變成一個切麵(之前的非核心業 ...
  • cd命令是linux實際使用當中另一個非常重要的命令,本文就為大家介紹下Linux中cd命令的用法。 更多Linux命令詳情請看:Linux命令速查手冊 Linux cd命令用於切換當前工作目錄至 dirName(目錄參數)。 其中 dirName 表示法可為絕對路徑或相對路徑。若目錄名稱省略,則變 ...
  • 在我們安裝PHP模塊時,有時需要註意PHP編譯的版本,下麵講解下PHP中VC6、VC9、TS、NTS版本的區別與用法詳解,介紹php的兩種執行方式。 1. VC6與VC9的區別:VC6版本是使用Visual Studio 6編譯器編譯的,如果你的PHP是用Apache來架設的,那你就選擇VC6版本。 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...