zoukankan      html  css  js  c++  java
  • [Python]Python中的包(Package)

    参考官方文档中的Module和Glosssary中的描述。
    Module: https://docs.python.org/3/tutorial/modules.html#packages
    Glossary: https://packaging.python.org/glossary/#term-module

    更通俗的理解参考:

     https://www.liaoxuefeng.com/wiki/0014316089557264a6b348958f449949df42a6d3a2e542c000/0014318447437605e90206e261744c08630a836851f5183000

    什么是Module?

    在说明Package之前,首先需要介绍Python中的模块(Module)。
    模块是Python中实现代码复用的基本单元。
    可以简单理解为一个py文件就是一个模块。如用户在echo.py文件中定义了echo()函数, 用户可以在hello.py文件中调用echo模块中的echo()函数,实现代码复用。
    不过实际上模块还分为纯模块(Pure Module)与扩展模块(Extension Module).
    纯模块用Python编写并保存在单独的.py文件中(可能会关联.pyc或.pyo文件), 如上面举的echo.py的例子。
    扩展模块是用比Python的更底层语言实现的功能,如C/C++/Java写的底层扩展。这些扩展通常包含在一个可动态载入的预编译文件中,如Unix下的.so文件(Shared Object), Windows下的DLL文件(使用.pyd扩展名)。

    什么是Package?

    pacakge可认为是模块的集合,是python文件的归档。 Python将含__init__.py的文件夹视为一个包。
    细究起来分为本地包(Import Package)和正式发布的包(Distribution Package)。两者都简称为package。
    Import Package也是一个Python模块,只是该模块中递归的包含了其他的模块或package,简单理解为一组文件的归档。
    而Distribution Package是在网上发布的package。与本地package不同,Distribution的包除了包含其他包/模块之外,还包含与包发布相关的其他资源文件,并带有版本号。

    包的载入过程

    包也是Python构造模块命名空间的一种方式,用户通过".module-name"来进行调用变量。比如A.B表示B是A包的一个子模块。
    通过使用模块,用户不必担心模块中的变量名会与全局变量名冲突, 也不用担心不同的模块变量名相同的冲突。
    以一个叫做sound的模块为例,假设sound模块含以下结构:

    sound/                        Top-level package
      __init__.py               Initialize the sound package
        formats/                 Subpackage for file format conversions
      __init__.py
        wavread.py
        wavwrite.py
        aiffread.py
        aiffwrite.py
        auread.py
        auwrite.py
        ...
        effects/ Subpackage for sound effects
          __init__.py
          echo.py
          surround.py
          reverse.py
        ...
        filters/ Subpackage for filters
          __init__.py
          equalizer.py
          vocoder.py
          karaoke.py
          ...
    当载入包时,Python通过sys.path下列出的路径来查找包的子文件夹。
    Python会将包含__init__.py的文件夹视为包。这样做是为了避免在文件夹取了一个通用名之后, 如string,导致搜索路径下后面同名文件夹被无意覆盖(?)。如sys.path下含/root/string. 如果string下有__init__.py文件,则认为其为一个Python包进行导入。如果不含, 则认为其为一个搜索路径,Python会搜索该路径下的其他文件夹,看是否有需要导入的模块。__init__.py可以是一个空文件,什么都不写,也可以执行一些初始化的操作或设置__all__变量。
    用户通过import导入包:
    import sound.effects.echo
    导入sound.effects.echo子模块后,必须通过全名才能引用该模块:
        sound.effects.echo.echofilter(input, output, delay=0.7, atten=4)
    也可以这样引用子模块:
        from sound.effects import echo
        echo.echofilter(input, out, delay=0.7, atten=4)
    也可以直接导入函数或变量:
        from sounds.effects.echo import echofilter
        echofilter(input, output, delay=0.7, atten=4)

    导入的时候,import语句首先验证对象是否在包中定义。如果包中未定义对象,则认为该对象是一个模块,并尝试载入。载入失败则抛出ImportError异常。

  • 相关阅读:
    jquery ajax下拉框省市联动效果实现代码
    冒泡排序算法
    Ext.form.ComboBox调用store.filterBy失效问题
    高性能建站之前端优化篇
    不用任何插件实现 WordPress 的彩色标签云
    Javascript 实现select的美化
    RabbitMQ安装与测试
    Select 下拉列表选择插件 (包含下拉选择图片,下拉grid等)
    Javascript 通过cookie记录浏览记录
    ActiveMQ安装与测试
  • 原文地址:https://www.cnblogs.com/oDoraemon/p/10432107.html
Copyright © 2011-2022 走看看