在我们查看别人的项目的时候,我们经常可以看到__init__.py这个py脚本,它存在于Python包的每个目录中,标示着该目录是一个Python包。这个文件可以为空,但它的存在有其特殊的意义。
总的来说,__init__.py文件扮演着初始化Python包的重要角色,其主要作用有以下几个
初始化python package
当一个目录下包含__init__.py文件时,Python会将该目录视为一个包。这个文件不仅可以用来组织代码结构,还可以用来执行包的初始化代码,或者定义当从包中导入模块时自动执行的代码。
比如,这里我们有一个名为mymodule的文件夹,其内部有一个名为module的py脚本。
当我们想要从mymodule文件夹中module.py作为模块使用其内部的一些函数时,在代码中便可以这样写
from mymodule import module
module.print_something('你好')
倘若我们使用setupTools将项目上传给pypi时(上传项目给pypi时需要上传的是一个文件夹,具体上传流程可查看往期文章:Python开发之手把手教你上传项目至PyPi(保姆级教程)-CSDN博客),我们的文件夹内没有__init__.py的话, 那么setupTools内的find_packages()函数将无法找到你要上传的文件夹,进而返回空值。
__init__.py存在时
__init_.py存在时find_packages()函数可以找到pywechat这个文件夹,并把他看做一个package
__init__.py不存在时
__init__.py不存在时,find_packages()函数无法找到pywechat这个文件夹,无法把它看做一个package
导入包内模块
依然以pywechat这个模块为例,当用户想要调用pywechat内的WechatAuto内的Messages类或某个函数时需要:
from pywechat.WechatAuto import Messages
from pywechat.WechatAuto import get_chat_history
get_chat_history()
Messages.send_messages_to_friend()
这样的导入可能有点太麻烦,我们只需要在__init__.py中这样写:
那么我们在调用时便可以直接从pywechat这个文件夹内导入函数或类,这时我们导入的所有类或函数都来自于__init__.py,由于我们在__init__.py里边已经导入过Messages类与get_chat_history函数,所以我们可以直接导入函数或类。
包的元数据信息
当我们在__init__.py中使用''' '''多行注释写了一些信息后,这些信息将被pylance(python解释器)当做该package文件夹下的help文档,当我们导入这个package后,对这个模块使用help函数后pylance便会将这些信息进行整理并格式化输出
pywechat __init__.py内的内容
import pywechat
print(help(pywechat))
输出结果
总之, _init__.py文件是Python包开发中不可或缺的一部分,它帮助开发者初始化包,组织代码结构并提供包的元数据信息。