zoukankan      html  css  js  c++  java
  • 模块和包的导入

    1.定义

    模块:用来从逻辑上组织python代码(变量,函数,类,逻辑)实现一个功能。

    本质上就是.py结尾的Python文件。

    比方说:文件名:test.py   ,对应的模块名为:test

    :用来从逻辑上组织模块的,本质上就是一个目录(必须带有一个叫__init__.py的文件)

    2.导入方法

    方法1:

    导入一个模块:import module_name

    导入多个模块:import module_name,module_name2

    这种方法导入后要用模块中的方法:module_name.func()

    方法2:

    导入一个模块中所有的功能   from module_name import *  

    不建议这样使用,因为这样导入的方式是将module_name中的所有代码都导入到当前环境中。在当前环境中想要调用module_name中的方法直接调用即可。不能在方法中加上module_name,如果加上运行这会报错返回"module_name"未定义。

    如果在module_name中的某一个函数和当前环境定义的函数相同,这会输出当前环境定义的函数,覆盖原来module_name中的同名方法。这样会产生冲突情况。

     

    导入一个模块中的指定功能(一个即以上)  from module_name import logger,func,func2

    如果当前环境中也有一个logger方法,还是会和上面的方法一样,也会被当前环境下定义的新的logger方法覆盖。

    优化方法:from module_name import logger as lg

    给方法取别名,这样就能避免重名的方法。

     

    3.import本质(路径搜索和搜索路径)

     导入模块的本质就是把.py文件解释一遍。

    import module_name----->module_name.py-------路径搜索---------->找到module_name.py的路径------->sys.path

      import module_name 就是把module_name解释一遍,等价于module_name=module_name.py文件中的所有代码解释后的所有内容。

      from module_name import func1 就是到module_name中找到func1,将func1解释了一遍,所以用这种方法导入后,想要调用func1直接调用即可,前面不用加上前缀。

    导入包的本质就是执行该包下的__init__.py文件。

     

    import的本质都是在路径中搜索指定的包或模块,默认会在当前路径中有限查找,如果要导入的包或模块不在当前路径中,会在PYTHONPATH环境变量的中的路径中查找。

    import sys,os
    print(sys.path)   #返回pythonpath环境变量的路径组成的列表。

    如果在pythonpath环境变量中都未能找到指定的包或模块,则会报错。

    为了确保导入,可以将要导入的包或模块的路径添加到sys.path中。

    import sys,os
    os.path.abspath(__file__)    #返回当前文件的path规范化的绝对路径
    file_path=os.path.dirname(os.path.dirname(os.path.abspath(__file__)))   #os.path.dirname(path) 返回path的目录。其实就是os.path.split(path)的第一个元素。
    sys.path.append(file_path)   #在pythonpath的列表的最后加上指定的路径。
    sys.path.insert(0,file_path)  #在pythonpath的列表的指定位置(0为首位)上添加file_path

    在PYTHONPATH环境变量中添加了指定的路径后,就能成功导入包或模块。

    导入包以后调用包内的模块及函数。

    有一个包名为package_test,下面有一个test1.py文件,一个__init__.py文件。

    在import_package.py文件中导入package_test:

    import package_test   #本质上是run __init__.py--->test1=‘test1.py all code'
    
    package_test.test1.name()  #想要能够成功运行包下面模块test1中的函数name()

    在__init__.py文件中输入“from . import test1”(从当前目录下导入test.py)  #本质上是test1=‘test1.py all code'。

    test.py文件中有个函数为name()。

    基于以上的条件“package_test.test1.name()” 能够成功执行。

    4.导入优化

    如果导入中重复地从模块中找到指定的对象。module_name.func()这种找法,每次调用module_name中的方法都需要不停地从module_name中找,会影响效率。

    优化方法:from module_name import func (as alias)

      调用时可以直接调用,不需要再func前面加上module_name.,就不再需要不断地重复到module_name中查找的过程。

    5.模块的分类:

    分为3大类:

      1.标准库。

      python解释器自带的模块。如:time&datetime, random, os, sys, shutil, json&pickle, shelve, xml处理, yaml处理, configparser, hashlib, subprocess, logging模块, re正则表达式

      2.开源模块。

      3.自定义模块。

  • 相关阅读:
    shutil模块详解
    pycharm连接服务器
    python中__name__属性的使用
    ORM学习笔记
    ORM连表操作
    python操作mysql实例
    python登录项目
    pycharm建立第一个django工程-----windows中
    打印顺序
    shell脚本
  • 原文地址:https://www.cnblogs.com/zoe233/p/7094278.html
Copyright © 2011-2022 走看看