python 包(package)和模塊(module)的創建和引入(import)


python 包(package)和模塊(module)的創建和引入(import

img

名詞解釋

實際上,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報錯的時候也能看出來。

引入方式

  1. import moduleName
  2. import packageName
  3. from packageName import moduleName\packageName
  4. from moudleName import Function\Class

引入父級目錄模塊

sys.path 是 sys 模塊中的內置變量。它包含一個目錄列表,編譯器將搜索所需的模塊。

如果要引入父級模塊,需要在引入之前需要在python的編譯器的環境變量中添加當前文件父目錄,然后再import,有兩個添加方法

  1. sys.path.append(os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
  2. 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

使用方式

先看一下在引入默認模塊(比如osmathrandom)的時候,使用被引入的模塊的方式:

>>> 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

img署名-非商業性使用-相同方式共享 3.0 美國 (CC BY-NC-SA 3.0 US) © 2021 蘇月晟。


免責聲明!

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



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