一. 包的概念
包是将模块以文件夹的组织形式进行分组管理的方法,使用package具有以下优点:
- 将一些列模块进行分类管理,有利于防止命名冲突;
- 可以在需要时加载一个或部分模块,而不是全部模块。
1. __init__.py文件
- __init__.py 是常规包(区别于远程包)内必须存在的文件;
- __init__.py 会在包加载时被自动调用;
- __init__.py 用来编写此包的内容,并在内部填写包的文档字符串。
2. 包的导入语法
import 包名 [as 包别名]
import 包名.模块名 [as 模块新名]
import 包名.子包名.模块名 [as 模块新名]
from 包名 import 模块名 [as 模块新名]
from 包名.子包名 import 模块名 [as 模块新名]
from 包名.子包名,模块名 import 属性名 [as 属性新名]
from 包名 import *
from 包名.子包名 import *
3. 在__init__.py中编写__all__列表
- 用来记录此包中有哪些子包或模块需要在from import *语句导入时被导入;
- __all__列表只在from xxx import * 时起作用
4. 包的相对导入
- 定义:包的相对导入是指包内模块的相对导入;
- 语法:
from 相对路径包或模块 import 属性或模块
from 相对路径包或模块 import * - 说明:
包的相对导入不能用于import xxx 语句中; - 相对路径:
. 代表当前目录
.. 代表上一级目录
... 代表上2级目录
.... 以此类推 - 备注:相对导入时不能超出包的外部
5. 包的加载路径
- 搜索当前路径;
- 搜索sys.path给定的路径。
二. 自定义包的使用
1.文件组织架构:
2.run_mypack.py code:
import mypack.games.contra as contra
from mypack.games.tanks import Tanks
from mypack.games.supermario import SuperMario
if __name__ == "__main__":
print("主模块位于:{}".format(__file__))
contra = contra.Contra()
contra.play()
mario = SuperMario()
mario.play()
tanks = Tanks()
tanks.play()
print("程序结束")
mapack/__init__.py code:
"""此包用来示意自定义的包
此包含有一个子包:games;一个menu模块
"""
print("{}被加载".format(__file__))
备注:mypack/games/__init__.py内容与此文件内容类似:在模块被加载时,打印模块的完整路径;
mypack/menu.py code:
"""打印游戏菜单
1)魂斗罗
2)超级玛丽
3)坦克大战
"""
def show_menu():
print("1)魂斗罗")
print("2)超级玛丽")
print("3)坦克大战")
print("{}被加载".format(__file__))
mypack/games/game.py code:(所有游戏类的父类):
class Game:
def __init__(self):
self.name = ""
def play(self):
print("正在玩{}游戏...".format(self.name))
print("{}被加载".format(__file__))
mypack/games/contra.py code:(所有游戏类子类的内容相似,此处只列出魂斗罗类的具体实现)
"""魂斗罗游戏类
相对导入只能用在from ... import ...语句中
"""
from .game import Game
class Contra(Game):
def __init__(self):
self.name = "魂斗罗"
print("{}被加载".format(__file__))
运行结果: