![Python程序设计教程(第2版)](https://wfqqreader-1252317822.image.myqcloud.com/cover/531/34752531/b_34752531.jpg)
1.6.2 包及其定义
为了方便管理,通常将程序文件(模块)以特定目录的形式进行打包。作为包的目录中必须至少包含一个名为__init__.py的文件,也可以包含一些模块文件和作为子包的子目录。作为子包的子目录中同样至少包含一个名为__init__.py的文件。文件__init__.py的内容可以为空。
__init__.py文件的主要作用为:
(1)作为python中包与普通目录的区别标识。
(2)编写代码,定义类、函数、变量等对象。
(3)定义__all__变量来确定采用from moduleName import∗时导入的模块名称。
如果在d盘根目录下建立了pythonpackagetest目录,在该目录下创建了一个__init__.py文件。在该文件中定义了变量PI=3.14159。这时,可以通过以下方式来调用这个PI变量值。
![](https://epubservercos.yuewen.com/8599B6/18562449808364906/epubprivate/OEBPS/Images/image513.jpg?sign=1738936910-uI1eGuEMDpZJkbijvkTvyYfYOLWoO6OS-0-b62518848c398fb6168f0a739b28e8d7)
也可以用此方法来引用自定义包下__init__.py文件中定义的其他对象。如果再在此文件中定义XX=5、YY=10两个变量和printTest1()、printTest2()两个函数。此时__init__.py文件的内容为:
![](https://epubservercos.yuewen.com/8599B6/18562449808364906/epubprivate/OEBPS/Images/image514.jpg?sign=1738936910-YCgkDEmiL4Q9Sa1GxkVvJrtFsZxDWs1C-0-56ad6a703eca24b8896fcb426e4e373b)
此时通过from pythonpackagetest import∗方式导入后,可以引用PI、XX、YY 3个全部变量的值及全部函数。
![](https://epubservercos.yuewen.com/8599B6/18562449808364906/epubprivate/OEBPS/Images/image536.jpg?sign=1738936910-HQDoY4UW4NlP01v3dTAIJvazhwahwioj-0-884d4a536d85f66d298d679b65828712)
从刚才的例子可以看到,通过from模块名import∗这种方式可以导入模块中的所有对象。现在,再在此__init__.py文件中定义变量__all__=['PI','YY','printTest2']。pythonpackagetest目录下__init__.py文件的内容为:
![](https://epubservercos.yuewen.com/8599B6/18562449808364906/epubprivate/OEBPS/Images/image538.jpg?sign=1738936910-X5I9MeiHyawx2YQKIJB8xKnq63DFu2Bu-0-6ffeeb3fec34b75d2ad4d655740b14a0)
变量__all__定义了通过from模块名import∗所能够导入的对象内容。不在变量__all__列表中的对象不能通过此方式导入,例子如下:
![](https://epubservercos.yuewen.com/8599B6/18562449808364906/epubprivate/OEBPS/Images/image537.jpg?sign=1738936910-VDMxUWhcV6piwH75xwejTJghnzWIWUHW-0-6bc9279c485caf60c21919b78af92bf6)
再在pythonpackagetest包目录下创建hello.py和helloworld.py两个文件,也就是两个模块。文件hello.py中定义了函数printHello(),其内容为:
![](https://epubservercos.yuewen.com/8599B6/18562449808364906/epubprivate/OEBPS/Images/image557.jpg?sign=1738936910-8nBaYgxXK1BGKwxfmkYCISWUsdW4VgeY-0-b23725024751dd944f5da456dce49d3a)
文件helloworld.py中定义了printHelloWorld()函数,其内容为:
![](https://epubservercos.yuewen.com/8599B6/18562449808364906/epubprivate/OEBPS/Images/image558.jpg?sign=1738936910-iTKYzqhS3phkeReX7MB6Jlx8Es5aAlGE-0-b99bf135468c8a52ff07740768a93b7c)
可以通过如下方式引用这两个模块中的函数:
![](https://epubservercos.yuewen.com/8599B6/18562449808364906/epubprivate/OEBPS/Images/image559.jpg?sign=1738936910-VVtbzwwYo1rDjG3yjtW5LunbD3ztfRFd-0-3609e7bb4b2524a41e03b50008b5ac80)