第九章 自定义模块
9.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()
9.2 导入包
1.什么是python包?
包就是一个文件夹,在该文件夹下包含了一个__int__.py文件,该文件夹可用于包含多个模块文件
文件目录结构:

# __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.单入口模式
文件目录结构:

# 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)
浙公网安备 33010602011771号