⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 node8.html

📁 同样是来自国外的经典python教材
💻 HTML
📖 第 1 页 / 共 3 页
字号:
                            <p> 上面的程式码会导入(load)  <tt class="module">Sound.Effects.echo</tt> 这个module。如果你要使用这个module,你必须使用完整的名称,例如:   </p>                          <p> </p>                          <dl>                          <dd><pre class="verbatim">Sound.Effects.echo.echofilter(input, output, delay=0.7, atten=4)<br></pre>                            </dd>                            </dl>                              <p> 另外一个导入在package中的某个module的方法是:   </p>                            <p> </p>                            <dl>                            <dd><pre class="verbatim">from Sound.Effects import echo<br></pre>                              </dd>                              </dl>                                <p> 同样的,这会导入 <tt class="module">echo</tt> 这个moduel。不同的是,当你使用这个module的时候你就不用在写前面package的名称了。请看以下使用这个module的例子:  </p>                              <p> </p>                              <dl>                              <dd><pre class="verbatim">echo.echofilter(input, output, delay=0.7, atten=4)<br></pre>                                </dd>                                </dl>                                  <p> 你也可以直接的import某一个在module里面的函式或变数,如下例:  </p>                                <p> </p>                                <dl>                                <dd><pre class="verbatim">from Sound.Effects.echo import echofilter<br></pre>                                  </dd>                                  </dl>                                    <p> 同样的,这会导入 <tt class="module">echo</tt> 这个module,不同的是你现在可以直接的使用 <tt class="function">echofilter()</tt> 这个函式了:   </p>                                  <p> </p>                                  <dl>                                  <dd><pre class="verbatim">echofilter(input, output, delay=0.7, atten=4)<br></pre>                                    </dd>                                    </dl>                                      <p> 值得注意的是当你使用 <code>from <var>package</var> import <var>item</var></code> 这样的叙述时,你所import的东西可以是一个package中的module(或者是subpackage),或者是在module里面所定义的名称,例如变数、类别或是函式等等。                                    <code>import</code>  叙述会先测试是否这个东西真的存在于这个package,如果没有的话,会假设这是一个module然后试着导入(load)之。如果还失败的话,就会引发一个 <tt class="exception">ImportError</tt> 的例外状况(exception)。   </p>                                    <p> 相反的是,当你使用 <code>import <var>item.subitem.subsubitem</var></code> 这样的叙述时,除了最后一个东西(item)以外,其余的都必须是package。最后一个可以是 module 或是 package ,但是不能是一个定义在module里面的类别、成员或函式。  </p>                                    <p>  </p>                                    <h2> <br> 6.4.1 从一个Package中Import *   </h2>                                      <p> 那如果使用者写了 <code>from Sound.Effectsimport *</code> ,会造成什么结果呢?理想状况下,我们可能会期望会搜寻整个package目录,然后找出所有的module并且一一的import这些module。不幸的是,在Mac以及 Windows 平台下,档案的名称大小写并不统一。所以在这些平台之上,我们并无法保证  <span class="file">ECHO.PY</span> 这个档案应该被import成 <tt class="module">echo</tt>, <tt class="module">Echo</tt> 或  <tt class="module">ECHO</tt> (例如,Windows 95 有一个恼人的特点,就是会自动把所有的档案名称第一个字元大写)。DOS的8+3 档名限制对长的module名称来说,也是另一个有趣的问题。  </p>                                    <p> 所以唯一的解决方法就是package的作者要提供一个明显的index给用package的人。如果遵守这个习惯的话,当用package的人在import的时候使用                                    <code>from Sound.Effects import *</code> 的话,就会去找这个package的 <span class="file">__init__.py</span> 档案里面的 <code>__all__</code> 这个list变数,这个list里面就会包含所有应该被import进来的module名称了。身为Package的作者有责任要保持 <code>from                                    <var>package</var> import *</code> 这个档案的更新,但是如果package的作者确信没有人会用                                    <code>from Sound.Effects import *</code> 这种写法的话,也可以不使用这个档案。举例来说   <span class="file">Sounds/Effects/__init__.py</span> 这个档案就可以有下面这样的程式码:   </p>                                    <p> </p>                                    <dl>                                    <dd><pre class="verbatim">__all__ = ["echo", "surround", "reverse"]<br></pre>                                      </dd>                                      </dl>                                        <p> 这就表示 <code>from Sound.Effects import*</code> 会从 <tt class="module">Sound</tt> 这个package 里面import 这三个module。                                         </p>                                      <p> 如果没有定义  <code>__all__</code> 的话,                                      <code>from Sound.Effects import *</code> 这个叙述就 <i>不会</i> 从  <tt class="module">Sound.Effects</tt> 这个package里面import所有的module进入目前的命名空间(namespace)。唯一能保证的是                                      <tt class="module">Sound.Effects</tt> 这个package有被imported 进来(可能会执行 <span class="file">__init__.py</span> 里面的初始化程式码),并且这个package里面所定义的名称会被import进来。Package里所定义的名称包含了在                                      <span class="file">__init__.py</span> 里面所定义的名称(以及所import的module)。当然也包含了在之前用import引进来的module名称,例如:   </p>                                      <p> </p>                                      <dl>                                      <dd><pre class="verbatim">import Sound.Effects.echo<br>import Sound.Effects.surround<br>from Sound.Effects import *<br></pre>                                        </dd>                                        </dl>                                          <p> 在这个例子里,echo以及 surround 这两个modules都会被 import进来目前的命名空间(namespace)里。这是因为当 <code>from...import</code> 这个叙述执行的时候,这两个module都已经在这个package中有定义了(你也可以用                                        <code>__all__</code> 来定义)。  </p>                                        <p> 值得注意的是使用import * 这样的写法常常是不被鼓励的,因为这通常会使得你的程式的可读性降低。无论如何,在互动模式下这样做的确会使你减少打太多字的机会,而且有些的module在设计的时候就故意只让某些特别的名称可以被使用。  </p>                                        <p> 记住,使用 <code>from Package importspecific_submodule</code> 没有任何不对的地方。事实上,除非你的module的名字会和其他的名称冲突,否则这是常被推荐使用的形式。  </p>                                        <p>  </p>                                        <h2><a name="SECTION008420000000000000000"> 6.4.2 Package内的References(参考) </a> </h2>                                          <p> 在package之中的module常常需要彼此互相使用。例如说, <tt class="module">surround</tt> 这个module就有可能会使用到 <tt class="module">echo</tt> 这个module里的东西。事实上,由于这是最常见的,所以import的时候总是会先找自己这的package里面的module,然后再依照搜寻的路径来寻找。因此                                        <tt class="module">surround</tt> 这个module可以使用 <code>import echo</code> 或是  <code>from echo import echofilter</code> 就可以了。如果在自己所处的这个package里面找不到这个要import的module的话,  <code>import</code> 指令就会在第一级(top-level)的module里找所指定的名称。  </p>                                        <p> 当一个subpackage是在另一个package里的话(例如前面的 <tt class="module">Sound</tt> ),没有其他捷径可以让你使用其他在同一个外围的package里面的subpackage里的module,你必须使用完整的名称来指称你所要用的package。例如说,如果在 <tt class="module">Sound.Filters.vocoder</tt> 这个module里面你想要使用在 <tt class="module">Sound.Effects</tt> 这个package里的  <tt class="module">echo</tt> 这个module的话,你就要使用                                        <code>from Sound.Effects import echo</code> 这个叙述。   </p>                                        <p> <br>                                        </p>                                        <hr>                                        <h4>注脚</h4>                                         <dl>                                        <dt><a name="foot628">... 才会被执行。                                          </a><a name="foot628" href="node8.html#tex2html4"><sup>6.1</sup></a> </dt>                                          <dd>         事实上,函式的定义也是&rdquo;被执行&rdquo;的叙述,这个执行的结果是把函式的名称写入module的globalsymbol table里面。   </dd>                                            </dl>                                             <div class="navigation">                                            <table align="Center" width="100%" cellpadding="0" cellspacing="2"> <tbody>                                                <tr> <td><a href="node7.html"><img src="../icons/previous.gif" border="0" height="32" alt="Previous Page" width="32"></a></td> <td><a href="tut.html"><img src="../icons/up.gif" border="0" height="32" alt="Up One Level" width="32"></a></td> <td><a href="node9.html"><img src="../icons/next.gif" border="0" height="32" alt="Next Page" width="32"></a></td> <td align="Center" width="100%">Python 教学文件</td> <td><a href="node2.html"><img src="../icons/contents.gif" border="0" height="32" alt="Contents" width="32"></a></td> <td><img src="../icons/blank.gif" border="0" height="32" alt="" width="32"></td> <td><img src="../icons/blank.gif" border="0" height="32" alt="" width="32"></td> </tr>                                              </tbody>                                            </table> <b class="navlabel">Previous:</b> <a class="sectref" href="node7.html">5.资料结构</a> <b class="navlabel">Up:</b> <a class="sectref" href="tut.html">Python教学文件</a> <b class="navlabel">Next:</b> <a class="sectref" href="node9.html">7. 输入与输出</a> <br>                                            <hr></div> <!--End of Navigation Panel-->                                             <address> </address>                                            <hr>请看<i><a href="about.html">关于此文件&hellip;</a></i> 里面有关如何给我们建议的说明。                                              </body>                                            </html>

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -