Python __init__.py 文件使用


 

__init__.py的主要作用是:

1. Python中package的標識,不能刪除

2. 定義__all__用來模糊導入

3. 編寫Python代碼(不建議在__init__中寫python模塊,可以在包中在創建另外的模塊來寫,盡量保證__init__.py簡單)

 

__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語句引用機制:

導入包

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

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語句並不引用導入對象的命名空間,而是將被導入對象直接引入當前命名空間。

 

應用舉例:

程序結構:

-project 
 -data 
 -src 
  -filterCorpus.py 
  -translateMonolingual.py

問題描述:在translateMonolingual.py中引用filterCorpus.py中的函數fun1

from src import  filterCorpus
filterCorpus.fun1()

即使translateMonolingual.py和filterCorpus.py在同一文件夾下,若translateMonolingual.py中直接引用import filterCorpus會出錯 
。這是因為python3需要絕對路徑引用,從project的根位置開始指明被引模塊的位置。通用格式為:from directory import module 。如果module存在於directory1下的directory2,那么建議寫成from directory1.directory2 import module

為什么需要__init__.py 
__init__.py文件用於組織包(package)。這里首先需要明確包(package)的概念。什么是包(package)?簡單來說,包是含有python模塊的文件夾。一個python模塊(module)為一個py文件,里面寫有函數和類。包(package)是為了更好的管理模塊(module),相當於多個模塊的父節點。

當文件夾下有__init__.py時,表示當前文件夾是一個package,其下的多個module統一構成一個整體。這些module都可以通過同一個package引入代碼中。

__init__.py文件怎么寫 
可以什么都不寫,但如果想使用from package1 import *這種寫法的話,需要在__init__.py中加上:

__all__ = ['file1','file2'] #package1下有file1.py,file2.py

 

python中__init__.py文件的作用實例

python的每個模塊的包中,都有一個__init__.py文件,有了這個文件,我們才能導入這個目錄下的module。
那么,__init__.py還有什么別的功能呢?
其實,__init__.py里面還是可以有內容的,我們在導入一個包時,實際上導入了它的__init__.py文件。
我們可以再__init__.py文件中再導入其他的包,或者模塊。

[python]
import readers 
import writers 
import commands 
import users 
import meta 
import auth 
import admin 

 

這樣,當我們導入這個包的時候,__init__.py文件自動運行。幫我們導入了這么多個模塊,我們就不需要將所有的import語句寫在一個文件里了,也可以減少代碼量。
不需要一個個去導入module了。
__init__.py 中還有一個重要的變量,叫做 __all__。我們有時會使出一招“全部導入”,也就是這樣:
from PackageName import *
這時 import 就會把注冊在包 __init__.py 文件中 __all__ 列表中的子模塊和子包導入到當前作用域中來。比如:
#文件 __init__.py

__all__ = ["Module1", "Module2", "subPackage1", "subPackage2"]

 

 

 
 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM