今天犯了一个很蠢的错误,有关python的模块包的使用的

本文介绍如何构建Python模块包,包括创建包、子包及模块文件的过程,并解释了__init__.py文件的作用及其如何影响包的导入行为。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

<p>在引用自己构造模块包时,总是不成功</p>
<p></p>
<p>from XXXLib.Pub import *</p>
<p>dumpString("XXXX......")</p>
<p>总是报:NameError: name 'dumpString' is not defined</p>
<p></p>
<p>后来才想到是没有引用到具体的模块:</p>
<p>from XXXLib.Pub.shareDef import *</p>
<p>dumpString("XXXX......")</p>
<p></p>
<p><span style="color: #ff0000;">借此机会再来回顾一下如何构造自己的模块包:</span>
</p>
<p><span style="color: #ff0000;"><br></span>
</p>
<p><span style="color: #ff0000;">首先创建一个Package(我用的是Eclipse IDE)</span>
</p>
<p><span style="color: #ff0000;">然后再创建子包,记得用Package.SubPackage的方式命名</span>
</p>
<p><span style="color: #ff0000;">然后再创建子包里的Python模块,就是一个个py文件</span>
</p>
<p><span style="color: #ff0000;">在每个包的下面创建一个空的__init__.py文件,表示该目录为python的包</span>
</p>
<p><span style="color: #ff0000;"><br></span>
</p>
<p><span style="color: #ff0000;">然后就可以在别的py文件中引用包中的函数了,引用方式是</span>
</p>
<p><span style="color: #ff0000;">from Package.SubPackage.Module import *</span>
</p>
<p>==================================</p>
<p></p>
<div id="art" style="margin: 15px;">
<p><strong><span style="color: #000000;">Python模块包中__init__.py文件的作用<br></span>
</strong>
</p>
<p><strong><span style="color: #000000;">http://hi.baidu.com/nkhzj/blog/item/a6f0df00b2c39716728b65f1.html<br></span>
</strong>
</p>
<p><strong><span style="color: #000000;">模块包:</span>
</strong>
</p>
<p><span style="color: #000000;">包通常总是一个目录,目录下为首的一个文件便是 __init__.py。然后是一些模块文件和子目录,假如子目录中也有 __init__.py 那么它就是这个包的子包了。差不多就像这样吧:</span>
</p>
<pre><span style="color: #008000;">Package1/ __init__.py<br><br>
Module1.py<br><br>
Module2.py<br><br>
Package2/ __init__.py<br><br>
Module1.py<br><br>
Module2.py</span>
</pre>
<p><span style="color: #000000;">我们可以就这样导入一个包:</span>
</p>
<pre><span style="color: #ffa500;">import</span>
Package1</pre>
<p><span style="color: #000000;">或者调入一个子模块和子包:</span>
</p>
<pre><span style="color: #ffa500;">from</span>
Package1 <span style="color: #ffa500;">import</span>
Module1<span style="color: #ffa500;"><br><br>
from</span>
Package1 <span style="color: #ffa500;">import</span>
Package2<span style="color: #ffa500;"><br><br>
import</span>
Packag1.Module1<span style="color: #ffa500;"><br><br>
import</span>
Packag1.Package2</pre>
<p><span style="color: #000000;">可以深入好几层包结构:</span>
</p>
<pre><span style="color: #ffa500;">from</span>
Package1.Package2 <span style="color: #ffa500;">import</span>
Module1<span style="color: #ffa500;"><br><br>
import</span>
Package1.Package2.Module1</pre>
<p><span style="color: #000000;">大致就这样吧,我觉得,包的精髓应该是在 __init__.py 这个文件之中的。<br></span>
</p>
<p><span style="color: #000000;"><br><br></span>
</p>
<p><strong><span style="color: #000000;">__init__.py 文件:<br></span>
</strong>
<br><span style="color: #000000;">__init__.py 控制着包的导入行为。假如 __init__.py 为空,那么仅仅导入包是什么都做不了的。</span>
</p>
<pre><span style="color: #ffa500;">>>></span>
<span style="color: #ffa500;">import</span>
Package1<span style="color: #ffa500;"><br><br>
>>></span>
Package1.Module1<span style="color: #ff0000;"><br><br>
Traceback (most recent call last):<br>
File "<pyshell#1>", line 1, in ? <br>
Package1.Module1<br><br>
AttributeError: 'module' object has no attribute 'Module1'</span>
</pre>
<p><span style="color: #000000;">我们需要在 __init__.py 里把 Module1 预先导入:</span>
</p>
<pre><span style="color: #ffa500;"><span style="color: #009900;">#文件 __init__.py</span>
<br><br>
import</span>
Module1</pre>
<p><span style="color: #000000;">测试:</span>
</p>
<pre><span style="color: #ffa500;">>>></span>
<span style="color: #ffa500;">import</span>
Package1<span style="color: #ffa500;"><br><br>
>>></span>
Package1.Module1<span style="color: #0000ff;"><br><br>
<module 'Package1.Module1' from <br>
'Module.pyc'></span>
</pre>
<p><span style="color: #000000;">__init__.py 中还有一个重要的变量,叫做 __all__。我们有时会使出一招“全部导入”,也就是这样:</span>
</p>
<pre><span style="color: #ffa500;">from</span>
PackageName <span style="color: #ffa500;">import</span>
*</pre>
<p><span style="color: #000000;">这时 import 就会把注册在包 __init__.py 文件中 __all__ 列表中的子模块和子包导入到当前作用域中来。比如:</span>
</p>
<pre><span style="color: #008000;">#文件 __init__.py</span>
<br><br>
__all__ = [<span style="color: #008000;">'Module1'</span>
, <span style="color: #008000;">'Module2'</span>
, <span style="color: #008000;">'Package2'</span>
]</pre>
<p><span style="color: #000000;">测试:</span>
</p>
<pre><span style="color: #ffa500;">>>></span>
<span style="color: #ffa500;"> from</span>
Package1 <span style="color: #ffa500;">import</span>
*<span style="color: #ffa500;"><br><br>
>>></span>
Module2<span style="color: #0000ff;"><br><br>
<module 'Package1.Module2' from 'Module.pyc'></span>
</pre>
<p><span style="color: #000000;">__init__.py 文件会在导入时被执行。</span>
</p>
</div>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值