首页 > 编程语言 >Python包和模块

Python包和模块

时间:2024-04-10 16:58:55浏览次数:37  
标签:__ package Python py module 模块 my

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 环境变量添加)或者在你的代码文件所在的同一路径下。

标签:__,package,Python,py,module,模块,my
From: https://blog.csdn.net/u014548562/article/details/137602342

相关文章

  • python收到MQTT消息后再发http请求
    python收MQTT消息和 发http请求的代码在前面的文章都有介绍,这里直接上完整的功能代码mqtt2http.py#python3.6importloggingimportrandomimporttimeimportrequests#frompaho.mqttimportclientasmqtt_clientimportpaho.mqtt.clientasmqttBROKER='......
  • python 使用waitress替代flask自带的web服务器
    首席引入依赖安装waitrsspipintsllwaitress 然后在flask程序内引入依赖使用server()函数代替app.run()函数启动时,直接pythonxxx.py即可fromwaitressimportservefromflaskimportFlaskapp=Flask(__name__)@app.route('/')defhello_world():return'HelloWor......
  • Nginx模块安装配置
    Nginx模块安装配置一、查看nginx安装的模块要查看Nginx安装了哪些模块,可以使用Nginx的二进制文件运行nginx-V命令。这将输出Nginx版本和配置参数,包括编译时包含的模块。在命令行中运行以下命令:nginx-V查看输出中的--with-参数,这些参数后面通常会跟着模块名称,比如--w......
  • python paramiko_具有连续标准输出,非一次性读全
    如何完全读取Paramiko通道的缓冲区?要完全读取Paramiko通道的缓冲区,可以使用以下代码:importparamikossh=paramiko.SSHClient()ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())ssh.connect('hostname',username='user',password='pass')stdin,st......
  • python收到MQTT消息后写入mySQL
    python收MQTT消息和写mySQL的代码在前面的文章都有介绍,这里直接上完整的功能代码mqtt2mysql.py#python3.6importloggingimportrandomimporttimeimportmysql.connector#frompaho.mqttimportclientasmqtt_clientimportpaho.mqtt.clientasmqttBROKER......
  • JavaScript 模块的循环加载
    "循环加载"(circulardependency)指的是,a脚本的执行依赖b脚本,而b脚本的执行又依赖a脚本。//a.jsvarb=require('b');//b.jsvara=require('a');通常,"循环加载"表示存在强耦合,如果处理不好,还可能导致递归加载,使得程序无法执行,因此应该避免出现。 但是实际上,这是很......
  • python发http请求
    第一步安装 requests 库pipinstallrequests python代码#导入requests库importrequests#目标URLurl="http://192.168.1.1/get.php?calltel=13941128888888"#发送GET请求response=requests.get(url)#检查请求是否成功ifresponse.status_code==20......
  • OpenGauss数据库之Python驱动快速入门
    OpenGauss数据库之Python驱动openGauss是一款开源关系型数据库管理系统,采用木兰宽松许可证v2发行。openGauss内核源自PostgreSQL,深度融合华为在数据库领域多年的经验,结合企业级场景需求,持续构建竞争力特性。可是目前针对于OpenGauss数据库的Python应用程序的开发少......
  • BOSHIDA DC电源模块的功率调节和保护功能介绍
    BOSHIDADC电源模块的功率调节和保护功能介绍DC电源模块是一种用于将交流电源转化为直流电源的装置。它通常用于工业自动化设备、通信设备、医疗设备、汽车电子等领域。DC电源模块具有功率调节和保护功能,这些功能对于保证电源的稳定性和安全性至关重要。 第一,功率调节功能是D......
  • 那些场景需要进行实名认证?python身份证实名认证接口案例
    身份证实名认证接口是用来核验用户身份证信息真伪的接口,从而确保用户身份的真实性,常见的应用场景包含:1、在线教育:线上教育平台为了保障学习者身份的真实性和安全性,通常通过集成身份证实名认证接口来验证学习者身份是否为本人。2、企事业单位:政务部门、企事业单位等......