一個實際應用的程序往往有多個模塊、文件以及其它資源構成,為了清晰有效的組織這些程序,我們需要包來管理這些資源。Python中也支持包的概念。
Python包是存放程序模塊和子包的文件夾,是包含若干子包和模塊的命名空間。
每個包必須包含一個名為“__init__.py”的特殊文件,這個文件的內容可以為空,也可以包含導入模塊的數據或信息。
包內可以存放的資源
在Python創建一個包可以分為兩步:
(1)創建一個文件夾,并給這個文件夾一個合適的名字,文件夾的名字就是包的名字。
我們可以在操作系統準備創建包的目錄中直接創建,也可以在Python的集成開發環境中進行創建。
(2)在這個文件夾中創建__init__.py文件,這樣就把一個普通的文件夾轉換成了Python包。這個文件用于初始化包并列出包的所有模塊。也可以保持為空。
同樣可以在一個包里創建一個或多個子包,每個包中都要包含__init__.py文件。
用戶可以使用import導入定義的包。
其語法如下:
import packagename.subpackage1.subpackage2.modulename
import packagename.subpackage1.subpackage2.modulename as newModuleName
下面先給出包及文件的組織情況:
在Common包中包含兩個子包:math和strings,math包中又包含兩個子包:basic和high。
在具體創建文件時,可以在這些文件夾下直接創建文件,也可以在創建完畢后拷貝到相應的文件中。
使用像Pycharm這種集成的開發環境,可以方便的創建Python包,并在相應的包中創建python文件。
文件suanshu.py中的內容如下:
'''
求x+y的和
'''
def add(x, y):
return x + y
'''
求x - y的差
'''
def sub(x, y):
return x - y
'''
求x / y的商
'''
def div(x, y):
if y == 0:
raise('除數不能為0.')
return x / y
'''
求x*y的積
'''
def mul(x, y):
return x * y
文件bijiao.py中的內容如下:
'''求最大值'''
def max(x,y):
if x>=y:
return x
else:
return y
'''求最小值'''
def min(x, y):
if x <= y:
return x
else:
return y
文件str_utils.py中的內容如下:
'''字符串轉大寫'''
def toUpper(s):
return s.upper()
'''字符串轉小寫'''
def toLower(s):
return s.lower()
'''字符串翻轉'''
def reverse(s):
return s[::-1]
下面講解具體使用方法。
在Common所在的同一目錄中(注意不是在Common文件夾中)創建測試文件,如test.py。
(1)在test.py中導入若干方法
from Common.math.basic.suanshu import add,sub
x = 5
y = 3
print(add(x, y))
print(sub(x, y))
print(div(x, y))
輸出結果:
8
2
Traceback (most recent call last):
File "D:/98progarm/python/test.py", line 7, in <module>
print(div(x,y))
NameError: name 'div' is not defined. Did you mean: 'dir'?
結合代碼和運行結果,我們可以看出,通過from...import語法從Common.math.basic.suanshu中導入了add和sub兩個方法,而沒有導入div方法,所以,前兩個輸出了正確的結果,而第3個輸出語句給出了NameError錯誤。
(2)導入整個模塊中的所有內容
可以直接使用下面的語法格式導入包:
import Common.math.basic.suanshu
使用這種導入包或模塊時,需要使用包的全名來使用相關功能。
import Common.math.basic.suanshu
x = 5
y = 3
print(Common.math.basic.suanshu.add(x, y))
print(Common.math.basic.suanshu.sub(x, y))
print(suanshu.div(x, y))
輸出結果:
8
2
Traceback (most recent call last):
File "D:/98progarm/python/test.py", line 7, in <module>
print(suanshu.div(x,y))
NameError: name 'suanshu' is not defined
從源程序和輸出結果可以看出,使用 import 包名.子包(模塊)方式引入的方式需要帶上包全路徑名稱。
為了使用上的方便也可以使用下面的方式給引入的包起個別名。
(3)導入包時給包起別名
import Common.math.basic.suanshu as m
x = 5
y = 3
print(m.add(x,y))
print(m.sub(x,y))
print(m.div(x,y))
輸出結果如下:
8
2
1.6666666666666667
從源程序可以看出導入包時給包起別名可以大大減輕書寫上的困難。
(4)使用import *導入全部子模塊
可以使用下面的語法導入某個包中的所有子模塊。
from package.subpackage import *
上面這個語句的含義是從package.subpackage包中導入所有模塊。
但這種語句并非我們想象的那樣:從package.subpackage導入所有模塊,它需要在需導入模塊所在的包的__init__文件中定義名為__all__的列表,在該列表中定義由 import * 需要導入的模塊名稱。
如,我們在basic這個包的__init__文件中添加了下面的語句:
__all__ = ["suanshu"]
然后修改test.py文件中的內容如下:
from Common.math.basic import *
x = 5
y = 3
print(suanshu.add(x,y))
print(suanshu.sub(x,y))
print(suanshu.div(x,y))
輸出結果如下:
8
2
1.6666666666666667
當然,我們也可以使用下面的形式導入一個模塊中的所有內容。
(5)導入一個模塊中的所有內容
我們可以使用下面的語法格式導入一個模塊中的所有內容:
from package.subpackage.module import *
上面的語句含義是從子包subpackage導入module模塊中的所有內容,這樣,我們可以直接使用module定義的內容,而不必帶前綴。
from Common.math.basic.suanshu import *
import Common.math.high.bijiao as h
x = 5
y = 3
print(add(x,y))
print(sub(x,y))
print(div(x,y))
print(h.max(x,y))
輸出結果如下:
8
2
1.6666666666666667
5
新聞熱點
疑難解答