Python中模块与包详解

举报
Xxy_1008 发表于 2024/09/29 16:26:49 2024/09/29
【摘要】 一、模块(Module)定义与概念在 Python 中,模块是一个包含 Python 代码的文件,其扩展名为.py。模块可以包含函数、类、变量等定义。例如,创建一个名为my_module.py的文件,内容如下: def add_numbers(a, b): return a + b PI = 3.14159这里my_module.py就是一个模块,它包含了一个函数add_...
一、模块(Module)


  1. 定义与概念
    • 在 Python 中,模块是一个包含 Python 代码的文件,其扩展名为.py。模块可以包含函数、类、变量等定义。例如,创建一个名为my_module.py的文件,内容如下:
   def add_numbers(a, b):
       return a + b

   PI = 3.14159
  • 这里my_module.py就是一个模块,它包含了一个函数add_numbers和一个变量PI
  1. 模块的导入
    • import语句:可以使用import语句来导入整个模块。例如,要在另一个 Python 文件中使用my_module中的函数和变量,可以这样做:
   import my_module

   result = my_module.add_numbers(3, 5)
   print(my_module.PI)


  • 当使用import语句导入模块时,Python 会在sys.path(一个包含模块搜索路径的列表)指定的路径中查找模块文件。
  • from...import语句:如果只想导入模块中的特定部分(函数、类或变量),可以使用from...import语句。例如:
   from my_module import add_numbers, PI

   result = add_numbers(3, 5)
   print(PI)
  • 这种方式可以直接使用导入的对象名称,而不需要加上模块名作为前缀,但可能会导致命名冲突。
  • import...as语句:可以使用import...as语句给导入的模块或对象取一个别名。例如:
   import my_module as mm

   result = mm.add_numbers(3, 5)
   print(mm.PI)
  • 或者
   from my_module import add_numbers as add, PI as pi

   result = add(3, 5)
   print(pi)


  • 取别名在处理长模块名或者避免命名冲突时非常有用。


  1. 模块的搜索路径
    • Python 在导入模块时,会按照一定的顺序在以下几个位置搜索模块:
      • 当前目录:Python 首先会在当前执行脚本的目录下查找模块。
      • PYTHONPATH环境变量指定的目录:可以通过设置PYTHONPATH环境变量来添加模块搜索路径。
      • Python 的标准库安装目录:Python 会在其标准库的安装目录中查找标准库模块。
  2. 模块的执行与__name__属性
    • 当一个模块被直接执行时(例如,在命令行中运行python my_module.py),它的__name__属性的值为'__main__';当一个模块被导入时,它的__name__属性的值为模块名(例如my_module)。可以利用这一特性在模块中编写测试代码,如下:
   def add_numbers(a, b):
       return a + b

   if __name__ == '__main__':
       result = add_numbers(3, 5)
       print(result)
  • 这样,当模块被直接执行时会运行测试代码,但当模块被导入时,测试代码不会被执行。


二、包(Package)


  1. 定义与概念
    • 包是一种组织模块的方式,它是一个包含多个模块的目录,并且这个目录中必须包含一个名为__init__.py的文件(在 Python 3 中,__init__.py文件可以为空,但它的存在表示该目录是一个包)。例如,创建一个名为my_package的包:
   my_package/
       __init__.py
       module1.py
       module2.py
  • 这里my_package就是一个包,module1.pymodule2.py是包中的模块。


  1. 包的导入
    • 导入包中的模块:可以使用import语句来导入包中的模块。例如:
   import my_package.module1

   my_package.module1.some_function()
  • 或者使用from...import语句:
   from my_package import module1

   module1.some_function()
  • 导入包中的子包:如果包中有子包结构,如:
   my_package/
       __init__.py
       sub_package/
           __init__.py
           sub_module.py
  • 可以这样导入子包中的模块:
   import my_package.sub_package.sub_module

   my_package.sub_package.sub_module.some_function()
  • 或者
   from my_package.sub_package import sub_module

   sub_module.some_function()


  1. 相对导入(在包内部)
    • 在包内部的模块之间,可以使用相对导入来引用其他模块。相对导入使用.来表示当前目录,..表示上级目录。例如,在my_package/sub_package/sub_module.py中,如果要导入my_package/module1.py,可以使用:
   from... import module1


  • 这里的..表示从sub_package的上级目录(即my_package)中导入module1。相对导入有助于构建清晰的包结构,并且在包内部模块移动时可以减少导入路径的修改。


  1. __init__.py文件的作用
    • 初始化包__init__.py文件可以用于初始化包,例如在其中定义一些在包级别可用的变量或函数。例如:
   # my_package/__init__.py
   PI = 3.14159

   def package_function():
       print("This is a function in the package")
  • 这样,在导入包时就可以直接使用这些变量和函数:
   import my_package

   print(my_package.PI)
   my_package.package_function()
  • 控制包的导入行为__init__.py文件可以控制包中的哪些模块在使用from my_package import *语句时被导入。例如,可以在__init__.py文件中定义__all__列表:
   # my_package/__init__.py
   __all__ = ['module1']
  • 这样,当使用from my_package import *时,只会导入module1模块。
【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。