python 包(package
)和模塊(module
)的創建和引入(import
)
名詞解釋
實際上,Python中的函數(Function)、類(Class)、模塊(Module)、包庫(Package),都是為了實現模塊化引用,讓程序的組織更清晰有條理。
👉通常,函數、變量、類存儲在被稱為模塊(Module)的.py文件中,一組模塊文件又組成了包(Package)。
👉將函數、變量、類存儲在存儲在獨立的.py文件中,可隱藏代碼實現的細節,將不同代碼塊重新組織,與主程序分離,簡化主程序的邏輯,提高主程序的可讀性。
👉 有了包和模塊文件,可以在其他不同程序中進行復用,還可以使用其他人開發的第三方依賴庫。
本引用為CSDN博主「蝦米小餛飩」的原創文章,遵循CC 4.0 BY-SA版權協議,轉載請附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/Bit_Coders/article/details/119318000
package實際上就是就是一個文件夾,里面包含諸多module和一個__init__.py
,package是module的一種,這點在python報錯的時候也能看出來。
引入方式
import moduleName
import packageName
from packageName import moduleName\packageName
from moudleName import Function\Class
引入父級目錄模塊
sys.path 是 sys 模塊中的內置變量。它包含一個目錄列表,編譯器將搜索所需的模塊。
如果要引入父級模塊,需要在引入之前需要在python的編譯器的環境變量中添加當前文件父目錄,然后再import,有兩個添加方法
sys.path.append(os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
sys.path.append("..")
建議使用第一個方法,第二個方法會在除pycharm以外的地方運行的時候造成錯誤,原因是sys.path.append("..")
添加的是當前使用者所在目錄的父目錄,而不是當前這個文件的父目錄。
util.hi
是父級目錄中的模塊,引入方式如下:
import sys
sys.path.append(os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
import util.hi
注意事項
- ✔️在沒有
from
的情況下,moduleName
的形式可以是通過附屬關系按照packageName.moduleName
使用。 - ❌在有
from
的時候,import
后面必須是包名稱或者是函數名或者類名或者模塊名。但是不能用.
來表示層級關系,也就是說不能用向packageName.moduleName
之類的用法,但是可以用,
來區分不同的模塊。 - ✔️只有在有
from
的情況下,import
后面才能跟函數名或者類名
示范
這是當前的環境👇
.
├── main.py
├── test
├── testproject
│ ├── __init__.py
│ ├── pa1
│ │ ├── __init__.py
│ │ └── hello.py
│ └── testproject.py
└── util
這是pa1目錄下的hello.py
👇,有一個函數hello
和一個類HelloT
。
import sys
acb: str = "1232"
def hello():
print("hello world")
class HelloT:
def __init__(self) -> None:
pass
def hello(self):
print("call", sys._getframe().f_code.co_name)
正確示范
下面示范在根目錄下,main.py的正確import示范:
# 引入pa1包的hello.py模塊
from testproject.pa1 import hello
# 引入pa1包
import testproject.pa1
# 引入hello.py模塊
import testproject.pa1.hello
# 引入在testproject包的pa1包
from testproject import pa1
# 引入hello.py模塊下的hello函數和HelloT類
from testproject.pa1.hello import hello,HelloT
錯誤示范
下面示范在根目錄下,main.py的錯誤import示范👇,錯誤原因請對照注意事項
from testproject import pa1.hello
import testproject.pa1.hello.HelloT
使用方式
先看一下在引入默認模塊(比如os
、math
、random
)的時候,使用被引入的模塊的方式:
>>> import os
>>> os.path.abspath(".")
'C:\\Users\\蘇月晟\\Desktop\\pythonProject1'
>>> import math
>>> math.pi
3.141592653589793
>>> import random
>>> random.random()
0.11531493534041015
使用引入基本上只有兩個要求,一個是別重名,一個是使用引入的時候所使用的被引入模塊名字必須是和import
后面的一模一樣,比如說使用了import testproject.pa1.hello
,那么想使用hello模塊的時候必須用testproject.pa1.hello
而不是hello
。如果是使用了from testproject.pa1 import hello
來引入hello模塊,則在使用hello模塊的時候直接用hello
。
可以看一下下面的示例來具體了解其中的差異:
>>> import os.path
>>> path.abspath(".")
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
NameError: name 'path' is not defined
>>> os.path.abspath(".")
'C:\\Users\\蘇月晟\\Desktop\\pythonProject1'
>>> from os import path
>>> path.abspath(".")
'C:\\Users\\蘇月晟\\Desktop\\pythonProject1'
使用模塊中的常量
只需要在模塊中定義一個常量,然后在使用的時候用模塊名.常量名
就可以了,就像hello模塊里面有一個常量acb
,在引入hello模塊之后,用hello.acb
就可以調用常量acb
了
創建方式
創建包的時候,包目錄里面必須有__init__.py
,這個文件一般情況下可以是空的,具體這個文件怎么使用可以看Python init.py 作用詳解 - Data&Truth - 博客園 (cnblogs.com)
看一下下面的目錄結構
.
├── __init__.py
├── pa1
│ ├── __init__.py
│ └── hello.py
└── testproject.py
pa1是一個包,pa1目錄下面有一個__init__.py
,pa1下面還有一個hello.py
,這個文件是一個模塊。
hello.py
import sys
acb: str = "1232"
def hello():
print("hello world")
class HelloT:
def __init__(self) -> None:
pass
def hello(self):
print("call", sys._getframe().f_code.co_name)
這樣就創建了一個模塊。
LICENSE
署名-非商業性使用-相同方式共享 3.0 美國 (CC BY-NC-SA 3.0 US) © 2021 蘇月晟。