第十章 自定義模組

柠檬の夏天發表於2024-08-08

10.1 匯入模組

1.什麼是python模組?

​ Python模組(Module),是一個Python檔案,以.py結尾 模組可以定義函式,類和變數,模組裡也能包含可執行的程式碼

2.模組的作用:

​ python中有很多各種不同的模組,每一個模組都可以幫助我們快速的實現一些功能

3.模組的匯入方式:

# 模組在使用前需要先匯入 匯入的語法如下:
[from 模組名] import [模組|類|變數|函式|*] [as 別名]
 
 # 常用的組合形式如:
 import 模組名
 from 模組名 import 類 、變數、方法等
 from 模組名 import *
 import 模組名 as 別名
 from 模組名 import 功能名 as 別名
<==========================================>
# mian.py檔案
# import 匯入模組
import mymodule
import mymodule
"""
注意點:模組匯入時,匯入一次,終身受益,並不會重複匯入
"""
# 1.匯入的基本使用
# (1) 模組.變數
print(mymodule.cat)

# (2) 模組.函式
mymodule.jump()

# (3) 模組.類
print(mymodule.Classroom().name)

# 2.匯入任意模組路徑下的任意模組
"""
預設匯入當指令碼檔案同級目錄下的模組等..
系統執行流程:首先看一下sys.path裡面有沒有想要匯入的這個模組路徑
如果有,預設匯入,如果沒有,需要手動追加
"""
import sys
print(sys.path)
sys.path.append(r"D:\tmp")

# 3.from..import..基本使用
"""
from..從哪裡import..引入具體的某個成員"""
"""

# (1) 匯入單個成員
from mymodule import dog
print(dog)

# (2) 匯入多個成員
from mymodule import jump,lookdoor
jump()
lookdoor()

# (3) 匯入所有成員*帶有所有
from mymodule import *
print(dog)
print(cat)

# (4) 設定*匯入的範圍
from mymodule import *
print(dog) # error
print(cat)

# (5) 設定引入成員的別名 as
from mymodule import cat as c ,lookdoor as ld
print(c)
ld()

# 4.__name__的使用
"""
返回模組名字的魔術屬性__name__
如果當前檔案是直接執行的,返回"__main__字串"
如果當前檔案是間接匯入的,返回當前檔名(模組名)
"""
res = "__mian__"
print(res)
print(type(res))

<===========================================================>

# mymodule.py檔案
# 可以手動指定*的引入範圍
__all__ = ["cat"]

cat = '甜甜'
dog = '旺財'


def jump():
    print("小貓能上樹")


def lookdoor():
    print("小狗能看門")


class Classroom():
    name = "python32"


print("我是mymodule模組")
print(__name__)

"""
把需要引入的程式碼寫在if判斷的上面
把需要做簡單測試的程式碼,不需要引入的程式碼寫在if判斷的下面,防止匯入
"""
if __name__ == "__mian__":
    jump()
    lookdoor()

10.2 匯入包

1.什麼是python包?

​ 包就是一個資料夾,在該資料夾下包含了一個__int__.py檔案,該資料夾可用於包含多個模組檔案

檔案目錄結構:
image

# __int__.py檔案

print("初始化檔案被執行...")
__all__ =["ceshi3"]
ceshi1 = "ceshi1"
ceshi2 = "ceshi2"
ceshi3 = "ceshi3"

from package1 import my_module

<====================================================>

# my_module.py檔案

def myjoin():
    print("這是myjoin方法")

def mygetsize():
    print("這是mygetsize方法")
    
<====================================================>

# main.py檔案

# import匯入包
# 當引入包時,會自動指定包中__init__.py的初始化檔案,對包進行初始化,對包進行初始化
# 1.import引入包的語法
import package1
# 匯入包的屬性
print(package1.ceshi1)

# 匯入包下的某個模組
# 方法一:
import package1.my_module
package1.my_module.myjoin()

# 方法二: as 起別名
import package1.my_module as pm
pm.myjoin()

# 方法三: 把要引入的模組放到初始化檔案(__int__.py)當中進行引入,可以簡化操作
import package1
package1.my_module.mygetsize()

# 2.from ..import 引入包中具體成員的語法
# 引入包中的屬性
from package1 import ceshi2
print(ceshi2)

# 引入包中的模組
from package1 import  my_module
my_module.myjoin()

# 引入包中模組下的成員
from package1.my_module import mygetsize
mygetsize()

# 可以指定*號的範圍用 __all__
from package1 import  *
# print(ceshi2) # error
print(ceshi3)

# 可以用as起別名
from package1 import ceshi2 as c2 ,ceshi1 as c1
print(c1)
print(c2)

2.單入口模式
檔案目錄結構:
image

# pkg1_m1.py檔案
ceshi103 = "ceshi103"
ceshi104 = "ceshi104"

<================================================>

# pkg1_m2.py檔案
ceshi100 = "ceshi100"
ceshi101 = "ceshi101"

"""
.代表當前路徑 
..代表上一級路徑

相對路徑不能被直譯器直接引入,路徑找不到
分模組中的檔案不能直接執行,必須透過匯入到主入口檔案,
間接執行才能找到對應的路徑

含有相對路徑的分模組不能直接執行,得透過主入口檔案間接執行
"""
from . import  pkg1_m1
print(pkg1_m1.ceshi103)

from . pkg1_m1 import ceshi104
print(ceshi104)

# 找上一級中的一個模組
from .. import pkg_module1
print(pkg_module1.ceshi201)

# 找上一級中的一個模組裡的一個成員
from .. pkg_module1 import  ceshi202
print(ceshi202)

# 找上一級包中的具體某個模組
from .. pkg2 import pkg2_m2
print(pkg2_m2.ceshi300)

# 找上一級包中的具體某個模組裡的具體的某個成員
from .. pkg2.pkg2_m2 import ceshi301
print(ceshi301)

<=========================================================>

# pkg2_m2.py檔案
ceshi300 = "ceshi300"
ceshi301 = "ceshi301"

<=========================================================>

# pkg_module1.py檔案
ceshi201 = "ceshi201"
ceshi202 = "ceshi202"

<====================================================>

# main.py檔案
# 單入口模式
# 使用相對路徑進行匯入
import package2.pkg1.pkg1_m2 as ppp2
print(ppp2.ceshi100)

相關文章