• python之package定义


    一.简单说明

    python是通过module组织代码的,每一个module就是一个python文件,但是modules是通过package来组织的。我们平时在简单测试的时候
    一般就是几个Python文件存放在同级的目录下,但是当我们开始尝试开发更为复杂的项目时,package这个概念的使用就有助于我们写的一个
    个modules。

    二.python package

    package的定义很简单,在当前目录下有__init__.py文件的目录即为一个package。
    这里也会分为两种情况,一种是空的__init__.py文件,另外一种是包含代码的__init__.py文件。
    无论空与非空,这个目录都会被认为是一个package。

    三.package的初始化

    一个package被导入,无论什么时候,init.py的代码都只会执行一次。
    注意:由于package被导入时,init.py中的可执行代码会被执行,所以小心在package中放置你的代码,比如把代码尽可能封装成函数或类。

    3.1 init.py内部的导入顺序

    当尝试导入某个包时,如下:

    from package import something
    

    import语句会首先检查something是不是__init__.py的变量。然后检查是不是subpackage,再检查是不是module,最后抛出ImportError。
    顺序如下:
    1.init.py文件内变量
    2.是不是package内的subpackage
    3.是不是package内module

    举例说明:

    这里我们创建一个yuhaohao的package,目录下有sulli1.py sulli2.py init.py文件

    文件内容内下:
    sulli1.py

    #!/usr/bin/python3
    def tl():
        print("Hello, function 'tl' from module 'sulli1' calling")
    

    sulli2.py

    #!/usr/bin/python3
    def ol():
        print("Hello, function 'ol' from module 'sulli2' calling")
    
    

    init.py文件内容为空。

    [root@centos8 pipeline]# python3
    Python 3.6.8 (default, May 21 2019, 23:51:36) 
    [GCC 8.2.1 20180905 (Red Hat 8.2.1-3)] on linux
    Type "help", "copyright", "credits" or "license" for more information.
    >>> import yuhaohao
    >>> yuhaohao
    <module 'yuhaohao' from '/root/pipeline/yuhaohao/__init__.py'>
    >>> yuhaohao.sulli1
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
    AttributeError: module 'yuhaohao' has no attribute 'sulli1'
    >>> yuhaohao.sulli2
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
    AttributeError: module 'yuhaohao' has no attribute 'sulli2'
    

    可以看出yuhaohao的路径被包含在python的sys.path的环境变量中。但是sulli1.py和sulli2.py并没有被导入。
    如果想要在import yuhaohao后自动加载sulli1和sulli2模块,这里可以在__init__.py文件中增加如下内容:

    import sulli1
    import sulli2
    

    第二种方案就是手动导入,当想使用模块sulli1中的tl()函数时,需要手动导入

    >>> import yuhaohao.sulli1 as yu
    >>> yu.tl()
    

    下面是一个更复杂的例子,下载的URL为:https://www.python-course.eu/sound1.tar.bz2
    解压后,文件结构如下:

    sound
    |-- effects
    |   |-- echo.py
    |   |-- __init__.py
    |   |-- reverse.py
    |   `-- surround.py
    |-- filters
    |   |-- equalizer.py
    |   |-- __init__.py
    |   |-- karaoke.py
    |   `-- vocoder.py
    |-- formats
    |   |-- aiffread.py
    |   |-- aiffwrite.py
    |   |-- auread.py
    |   |-- auwrite.py
    |   |-- __init__.py
    |   |-- wavread.py
    |   `-- wavwrite.py
    `-- __init__.py
    

    这里直接使用import sound来导入这个package时,我们可以导入package sound,但是sound的子package(effects,filters,formats)并不会被自动
    导入,子package不会被自动导入的原因是因为在sound目录下的__init__.py文件并没有任何关于导入子package的代码。

    导入sound:

    >>> import sound
    sound package is getting imported!
    >>> sound.effects
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
    AttributeError: module 'sound' has no attribute 'effects'
    

    如果你想使用子package的内容,但是在父package的__init__.py的文件内并没有导入,你需要手动导入

    >>> import sound.effects
    effects package is getting imported!
    >>> sound.effects
    <module 'sound.effects' from '/root/pipeline/sound/effects/__init__.py'>
    

    如果你希望python帮你自动导入sound.effects你可以往sound目录下的__init__.py文件写入

    """An empty sound package
    
    This is the sound package, providing hardly anything!"""
    
    import sound.effects
    print("sound package is getting imported!")
    

    当然了,除了使用绝对路径你可以使用相对路径来导入sound.effects

    """An empty sound package
    
    This is the sound package, providing hardly anything!"""
    
    from . import effects
    print("sound package is getting imported!")
    

    这跟linux的命令行比较像,.代表当前目录,..代表上级目录。所以你可以在sound.effects的__init__.py文件内写入

    from .. import formats
    

    参考链接:https://www.jianshu.com/p/178c26789011

  • 相关阅读:
    关于使用AJAX获取数据时,由于IE缓存而导致数据不更新,串数据的问题!
    优化PHP代码的40条建议(转)
    这么晚了!难得今天看了几个小时的JAVA
    WEB开发,路漫漫其修远兮,个人的求索思考
    (转)高效的MySQL分页
    20121108随笔,关于代码严谨性、编写的优雅性
    Ubuntu 12.04LTS 安装PHP扩展pdo_oci.so支持ORACLE数据库
    程序员应该具备的11项基本技能
    Windows下配置使用MemCached
    PHP浮点数比较
  • 原文地址:https://www.cnblogs.com/yuhaohao/p/13099546.html
Copyright © 2020-2023  润新知