Python 包:存放多个模块的文件夹

文摘   科技   2024-10-12 14:59   上海  

点击蓝字,关注山海摸鱼人

目录:

  1. 什么是Python包?
  2. __init__.py 的作用
  3. 自定义创建一个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.pymoyu_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后,你应该能看到控制台输出了一系列的信息,包括对用户的问候、当前时间以及两则小故事的内容。如果尝试调用了一个未定义的故事,则会得到一个默认的错误提示消息。

山海摸鱼人
致力于记录美好之瞬间,追寻美好之明天。
 最新文章