Python入门篇(六)---模块和包

目录

模块的概念和使用

模块的概念

模块的导入

导入指定的函数或变量

给模块起别名

模块的重载

使用reload()函数

修改模块后重新加载

注意事项

包的概念和使用

包的概念

包的使用

包的导入

包的相对导入

包的 __init__.py 文件

包的使用注意事项


模块的概念和使用

模块的概念

Python的模块是一个包含了相关函数、类、变量和常量等的代码块,模块通常保存在独立的.py文件中,通过模块可以把程序分解为小的、具有独立功能的模块,这样不仅可以提高代码的可读性和可维护性,而且可以更好地组织和管理代码。

模块的导入

Python中的模块可以直接通过import语句导入,语法如下:

这里的module_name就是要导入的模块名称,可以是Python标准库中的模块,也可以是第三方库或自己编写的模块。

导入指定的函数或变量

在使用模块时,我们可以选择只导入其中的某些函数或变量,而不是全部导入,这样可以避免命名冲突和减少内存占用。语法如下:

 这里的function_namevariable_name就是要导入的函数或变量名称,多个名称之间用逗号分隔。

给模块起别名

为了避免模块名称过长或命名冲突,我们可以给模块起一个别名,然后使用别名来访问模块中的函数和变量。语法如下:

模块的重载

当使用import语句导入模块时,Python会在搜索路径中找到第一个匹配的模块,并将其加载到内存中。如果在程序运行时发现需要更新该模块,可以通过重新加载该模块来更新它。

使用reload()函数

要重新加载模块,可以使用内置函数reload()reload()函数将重新加载之前已经导入的模块,以便在模块已更改时更新它。

使用reload()函数需要导入内置模块importlib,如下所示:

使用reload()函数的方法如下:

修改模块后重新加载

为了演示如何重载模块,请考虑以下情况。假设有一个名为my_module的模块,它包含以下代码: 

现在,在另一个文件中导入并使用该模块:

现在,如果更改my_module.py文件中的x值并重新运行main.py,您将看到输出仍然是10,即使已经更改了my_module.py文件中的值。这是因为Python已经将my_module模块加载到内存中,因此不会重新读取文件。

要使更改生效,需要重新加载该模块。下面是如何通过重载my_module模块来实现:

通过重载my_module模块,现在已经成功更新了x的值,因此输出为20。

注意事项

需要注意的是,reload()函数是在Python 2.x中引入的,在Python 3.x中被移到了内置模块importlib中。此外,由于模块的导入只在程序执行的时候发生一次,因此模块的重载只有在动态地重新加载模块时才能生效。

另外,模块重载也可能会引入一些意想不到的行为,因为重新加载模块会导致新的模块对象生成,这可能会导致某些意外的结果,特别是当模块是在其他模块之间共享的全局状态时。

包的概念和使用

包的概念

当我们编写大型的程序时,需要将相关的模块组织成一个包。Python 的包就是文件夹(目录),文件夹下必须有一个 __init__.py 文件,该文件夹称之为包。我们可以使用包来组织模块,这样可以避免模块名字冲突,也使我们更好地组织代码。

包的使用

包的导入

我们可以使用点号(.)来导入包中的模块。例如,假设有以下包结构:

 我们可以这样导入包中的模块:

包的相对导入

当我们在包中使用相对导入时,需要使用 . 表示相对位置。例如,假设我们在 my_package 包下的 module1 中导入 module2,则可以使用以下方式:

如果要使用父级包的模块,则可以使用两个点号(..)表示:

包的 __init__.py 文件

每个包目录下都必须包含一个名为 __init__.py 的文件,这个文件可以是空文件,也可以包含包的初始化代码。这个文件在包被导入时被执行。

例如,我们可以在 my_package 包的 __init__.py 中定义一些变量:

然后在其他模块中导入这个包并使用 PI 变量:

包的使用注意事项

当我们在包中使用相对导入时,需要特别注意一些事项:

  • 相对导入只能在包内使用。
  • 不要使用相对导入来引用顶层模块。
  • 在主程序中使用相对导入可能会导致导入失败。

下面是一个使用包的示例:

在上面的示例中,我们导入了 module1 中的所有函数到包的 __init__.py 中,并在主程序中导入了整个包。因此,我们可以使用 my_package.func1() 来调用 module1 中的函数,但是尝试调用module2中的函数时,会出现AttributeError,因为module2中没有定义名为func1的函数。此时可以使用from ... import ...语句重新导入需要的函数,或者使用importlib.reload重新加载module2模块。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

壹个命苦的程序猿

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值