Python包和模块

Python中的模块和包是用于组织代码的关键构造。它们可以帮助你将代码逻辑划分成可管理的部分,防止命名空间(namesspace)的冲突,并提供分享和重用代码的方式。

一、模块

模块是一个包含Python代码的文件。模块的名称就是文件的名称(不包含后缀.py)模块可以包含定义的函数,类,变量,也可以包含可直接运行的代码。

# my_module.py
def my_function():
    print("Hello from my_module!")

你可以使用import关键字导入并使用模块:

import my_module

my_module.my_function()  # 输出 "Hello from my_module!"

1.模块内置变量

Python的模块中通常包含以下几种内置变量:
__name__:这是一个内置变量,它表示模块的名称。如果当前模块是被导入的,__name__ 的值将是模块的名称。如果当前模块是直接执行的,那么 __name__ 的值将是 '__main__'。这个变量经常用于测试是否当前脚本是直接执行还是被其他模块导入。
__doc__:这个内置的字符串变量,用于表示模块的文档字符串。这个文档字符串通常在模块的开头,放在三个引号之间。
__file__:这个内置变量表示当前模块的文件名,包含了完整的路径。
__package__: 表示当前模块所在的包。对于顶级模块,__package__ 的值是 None。对于导入的包,__package__ 的值是包的名称。
__dict__:这个内置字典变量包含了模块的命名空间,包含了模块中的所有全局变量。
__all__:这个列表变量定义了该模块通过from module import *语句应该提供哪些变量、函数或者类。
下面是对应的示例:

"""
This is a docstring for the example module.
"""


def my_function():
    pass


class MyClass:
    pass


print("__name__:", __name__)
print("__doc__:", __doc__)
print("__file__:", __file__)
print("__package__:", __package__)
print("__dict__:", list(__dict__.keys()))

二、包

包是一个包含模块和一个特殊的 __init__.py 文件的目录,__init__.py文件表示这个目录是一个Python包,可以包含其他模块和子包。包是Python的一种用于封装模块集合的方式, 相当于“文件夹”。

假设我们有以下的目录结构:

my_package/
    __init__.py
    my_module.py

你可以这样导入并使用包中的模块:

from my_package import my_module

my_module.my_function()  # 输出 "Hello from my_module!"

注意: 从Python 3.3开始,包目录下不再必须存在__init__.py文件,Python 也引入了“命名空间包”(Namespace Packages)的概念,允许你创建目录结构的同时并不将其视作一个常规包。但为了保持最佳的兼容性,通常人们还是会添加 __init__.py 文件。

1.包的层次与结构


在Python中,包是具有分层结构的模块集合,就像文件系统中的文件夹和文件。一个Python包是一个目录,该目录包含一个特殊文件__init__.py(可以为空)和其它模块或子包。
假设我们有如下的目录结构:

my_project/
│
└── my_package/
    ├── __init__.py
    ├── my_module.py
    └── sub_package/
        ├── __init__.py
        └── sub_module.py

在这个例子中,my_package是一个包,my_module.py是my_package的一个模块,sub_package是my_package的一个子包,sub_module.py是sub_package的一个模块。
当你需要在模块中使用包的内容时,你需要导入它们。例如:

# 导入 my_module 模块
from my_package import my_module

my_module.my_function()

# 从 sub_module 导入函数
from my_package.sub_package.sub_module import my_other_function

my_other_function()

记住,__init__.py文件是非常重要的,因为它标志着包的存在。虽然从Python 3.3开始,你可以创建没有__init__.py的包(称之为命名空间包),但是出于兼容性考虑,建议始终包含__init__.py文件

2.__init__.py文件


在Python中,__init__.py 文件用于标记一个目录为Python包,该文件可以为空。
当一个目录被识别为Python包时,你可以在该目录里面的其他Python文件中使用 from . import xxx 这种形式的相对导入,这种导入会根据当前模块的位置寻找其他模块。
在 __init__.py 文件中,还可以执行一些对包的初始化操作,例如定义 __all__ 变量以控制 from package import * 语句的行为,或者预先导入一些模块以提供方便的访问途径。
例如:

# 在 __init__.py 文件中
__all__ = ['sub_module1', 'sub_module2']

from . import sub_module1
from . import sub_module2

上面的__init__.py定义了__all__变量以及预先导入了sub_module1和sub_module2,这样在导入包的时候,就可以直接使用这两个子模块了:

from my_package import sub_module1

sub_module1.some_function()

3.导入包和子包


在Python中,当你想使用其他模块(或包、子包)中的代码时,你需要导入它。导入的基本语法是使用 import 关键字,后跟模块、包或子包的名称。一旦导入,你就可以使用导入模块中的函数、类或变量。
考虑这样一个目录结构:

my_project/
│
└── my_package/
    ├── __init__.py
    ├── my_module.py
    └── sub_package/
        ├── __init__.py
        └── sub_module.py

你可以像这样导入包、模块和子包:
导入包:

import my_package

要使用包中的模块或函数,你需要使用包名作为前缀:

my_package.my_module.some_function()


导入模块:

from my_package import my_module

然后你可以直接使用模块中的函数或类,不需要包的前缀

my_module.some_function()

导入子包:

from my_package import sub_package

要使用子包中的模块或函数,你需要使用 sub_package 作为前缀:

sub_package.sub_module.some_function()

直接从子包导入模块:

from my_package.sub_package import sub_module

然后你可以直接使用 sub_module 中的函数或类,不需要包的前缀:

sub_module.some_function()

注意,Python的导入机制基于文件路径。你的代码需要知道如何找到 my_package,这通常意味着 my_package 需要位于你的Python解释器的路径(可以使用 PYTHONPATH 环境变量添加)或者在你的代码文件所在的同一路径下。

  • 23
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值