目录:
什么是Python包? __init__.py
的作用自定义创建一个Python包
什么是Python包?
包就是一种用来存放相关联的模块(即.py
文件)的方式。简单来说,一个包含有__init__.py
文件的文件夹就可以被视作一个包。这个特殊的__init__.py
文件可以为空,也可以包含一些初始化代码。
包:本质上是一个文件夹,这个文件夹内至少有一个名为 __init__.py
的文件。它可以是空文件,也可以包含初始化代码。在Python 2.x中, __init__.py
的存在是必需的,它标志该文件夹作为一个包。自Python 3.3开始引入了隐式命名空间包的概念,这意味着即使没有 __init__.py
文件,某些情况下目录仍然可以作为包来使用。这主要适用于跨多个目录分布的包。尽管如此,在大多数情况下,特别是当你创建自己的包时,依然推荐保留 __init__.py
文件,因为它可以用来执行包级别的初始化操作,并且有助于保持向后兼容性。
__init__.py
的作用
1、标识包:__init__.py
的存在告诉Python解释器该目录应该被视为一个包,这样你就可以通过点号(.
)来访问其中的子模块或子包。
2、初始化代码:可以在__init__.py
中编写初始化代码,比如导入包中的特定函数或类,设置全局变量等。当包第一次被导入时,这些代码就会被执行。
3、控制导入行为:你可以利用__init__.py
来控制包内的哪些内容对外可见。例如,只希望暴露部分功能给外部调用者,而隐藏内部实现细节。
接下来,我们就从零开始创建一个简单的Python包。
自定义创建一个Python包
首先,我们需要创建一个基本的项目结构。假设我们要开发一款与“摸鱼”相关的应用程序,比如记录工作日志、提醒休息时间等。为此,我们可以创建如下目录结构:
- shanhai_moyuren/
- __init__.py
- moyu_tools.py
- moyu_stories.py
- main.py
这里,“shanhai_moyuren”是我们主程序包的名字;moyu_tools.py
和moyu_stories.py
则是该包下的两个模块,分别用于实现工具函数和故事讲述功能。
编写 moyu_tools.py
在这个模块中,我们将实现几个实用的小工具,比如打印问候语、获取当前时间等。
# shanhai_moyuren/moyu_tools.py
from datetime import datetime
def print_hello(name):
"""打印一条问候信息"""
print(f"你好,{name}!欢迎来到山海摸鱼人的世界~")
def get_current_time():
"""返回当前的时间字符串"""
return datetime.now().strftime("%Y-%m-%d %H:%M:%S")
编写 moyu_stories.py
另一个模块moyu_stories.py
则负责讲故事。我们先准备两个小故事,并提供一个方法根据输入的故事名称进行选择性地讲述。
# shanhai_moyuren/moyu_stories.py
def tell_story(story_name):
"""根据给定的故事名讲述对应的故事"""
stories = {
'yugong_yishan': '很久很久以前,在中国的北方有一座名叫王屋的大山...',
'nanguo_xiaozi': '从前有个南郭先生,他不会吹竽...'
}
story = stories.get(story_name, "哎呀,这个故事我还没学会呢!")
print(story)
初始化 __init__.py
为了让用户更方便地使用我们提供的功能,可以在__init__.py
中预加载一些常用的函数或类。这一步虽然不是必须的,但能让我们的包更加友好易用。
# shanhai_moyuren/__init__.py
from .moyu_tools import print_hello, get_current_time
from .moyu_stories import tell_story
现在,当用户导入shanhai_moyuren
时,可以直接访问到上述定义好的函数了。
在主程序中使用自定义包
最后,我们在项目的根目录下编写一个main.py
作为入口点,演示如何导入并使用刚刚创建的包。
# main.py
import shanhai_moyuren as moyu # 使用别名简化引用
if __name__ == "__main__":
ren = "山海摸鱼人"
# 打印问候语
moyu.print_hello(ren)
# 获取并打印当前时间
current_time = moyu.get_current_time()
print(f"现在的时间是: {current_time}")
# 讲述指定的故事
moyu.tell_story('yugong_yishan')
moyu.tell_story('nanguo_xiaozi')
moyu.tell_story('unknown_story') # 测试不存在的故事
运行main.py
后,你应该能看到控制台输出了一系列的信息,包括对用户的问候、当前时间以及两则小故事的内容。如果尝试调用了一个未定义的故事,则会得到一个默认的错误提示消息。