Python包

本文介绍了Python包的概念,包括包的组织结构、导入语法、__init__.py的作用,以及如何自定义和使用包。详细讲解了包的相对导入、__all__列表的功能,并提供了自定义包的文件组织架构示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一. 包的概念

包是将模块以文件夹的组织形式进行分组管理的方法,使用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__))

运行结果:

代码下载:https://github.com/MiaLi0521/mypackage.git

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值