• Python编程——模块、包和__init__.py


    1. 模块

    Python中的一个文件即为一个模块(Module),一个模块引用另外一个模块的变量、函数或类时,使用import来导入。模块名即文件名。

    fibo.py 文件下有如下代码:

        def fib(n):    # write Fibonacci series up to n
            a, b = 0, 1
            while a < n:
                print(a, end=' ')
                a, b = b, a+b
            print()
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    那么在main.py文件中如下使用fibo模块。

        import fibo
        
        fibo.fib(100)
    
    • 1
    • 2
    • 3

    或者直接导出指定函数,此方法可能导致同名函数被覆盖导致代码异常。

        from fibo import fib
        
        fib(100)
    
    • 1
    • 2
    • 3

    2. 包

    2.1. 基本用法

    包(Package)是模块的一个集合,一个包中可以有多个子包。包名即目录名,包目录下必须包含__init__.py文件,否则只是一个多模块的文件夹
    在这里插入图片描述

    在main.py中导入algo.real模块:

        import algo.real 
        import algo.complex
        
        print(algo.real.add(1, 2))
    
    • 1
    • 2
    • 3
    • 4

        from algo import real, complex
        
        print(real.add(1, 2))
    
    • 1
    • 2
    • 3

    2.2. 高级用法

    2.2.1. 导入所有模块

    如果包中的模块非常多,想一次全部导入包中的模块,则需要在__init__.py中指定所有导出的模块。为什么不建议__init__.py文件留空呢?留空默认表示导出所有包中的模块。如果包中有一些单元测试的模块,只用于开发自测。如果用户使用from XXX import *导入所有模块,就会导致单元测试模块也被执行,这是不符合用户预期的。所以包设计者应该显式在__init__.py中导出所有模块,避免这种可能的异常。

        # coding=utf-8
        
        from . impourt real, complex
        __all__ = ['real', 'complex']
    
    • 1
    • 2
    • 3
    • 4

    然后在main.py中调用:

        # coding=utf-8
        from algo import *
        # 导入algo包中的__init__.py模块中__all__记录的所有模块
        
        print(real.add(1, 2))
        print(complex.sub(2, 1))
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    2.2.2. 设置公共信息

    可以在__init__.py中设置包版本和作者信息,还可以设置一些包的变量和公共函数等。

    __version__ = "1.0"
    __author__ = "Your Name"
    
    def init_pakage():
      pass
    
    • 1
    • 2
    • 3
    • 4
    • 5

    3. 搜索路径

    3.1. 模块搜索路径

    当导入一个名为 spam 的模块时,解释器首先会搜索具有该名称的内置模块。 这些内置的模块的名称在 sys.builtin_module_names 中列出。 如果未找到,它将在变量 sys.path 所给出的目录列表中搜索名为 spam.py 的文件。 sys.path 是从这些位置初始化的:

    • 被命令行直接运行的脚本所在的目录(或未指定文件时的当前目录)。

    • PYTHONPATH (目录列表,与 shell 变量 PATH 的语法一样)。

    • 依赖于安装的默认值(按照惯例包括一个 site-packages 目录,由 site 模块处理)。

    所以要增加搜索路径,可以在命令行中先行设置环境变量PYTHONPATH,再执行脚本即可。也可以在代码中

    sys.path.append(‘/ufs/guido/lib/python’)

    3.2. 相对路径

    当一个包有多个子包时,子包导入模块时,其默认路径并不是子包当前路径,此时如果想指定当前路径,则需要使用相对路径导入。

        from . import sub_math
        # 从当前目录导入模块sub_math
        
        from .sub_pack import *
        # 从当前目录的子包sub_pack中导入所有模块
        
        from .. import utils
        ## 从上级目录导入模块utils
        
        from ..filters import equalizer
        # 从上级目录的包filters中导入模块equalizer
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
  • 相关阅读:
    kafka复习:(26)通过RecordHeaders和RecordHeader来实现TTL功能
    GIGE 协议摘录 —— 照相机的标准特征列表(五)
    谷歌浏览器打开白屏 后台还有还有很多google chrome进程在运行
    【代码学习】聚类方法及实现记录
    Python-基础学习-第二轮
    FITC荧光标记脂多糖 FITC-LPS;CY3、CY5、CY7标记芽霉菌糖/昆布多糖/海洋硫酸多糖/聚二糖/棉籽糖定制合成
    系统移植开发阶段部署
    MYSQL练习题:访问日期之间最大的空档期
    数字化转型的关键在于节省时间
    CentOS 添加NTP服务器配置
  • 原文地址:https://blog.csdn.net/feihe027/article/details/134339256