• 9、python全栈之路-模块与包


    九、模块与包

    http://www.cnblogs.com/Eva-J/articles/7292109.html#_label7

    1、模块

    1.1 什么是模块

    常见的场景:一个模块就是一个包含了python定义和声明的文件,文件名就是模块名字加上.py的后缀。

    但其实import加载的模块分为四个通用类别: 

    1 使用python编写的代码(.py文件)

    2 已被编译为共享库或DLLCC++扩展

    3 包好一组模块的包

    4 使用C编写并链接到python解释器的内置模块

    1.2 为何要使用模块

       如果你退出python解释器然后重新进入,那么你之前定义的函数或者变量都将丢失,因此我们通常将程序写到文件中以便永久保存下来,需要时就通过python test.py方式去执行,此时test.py被称为脚本script

        随着程序的发展,功能越来越多,为了方便管理,我们通常将程序分成一个个的文件,这样做程序的结构更清晰,方便管理。这时我们不仅仅可以把这些文件当做脚本去执行,还可以把他们当做模块来导入到其他的模块中,实现了功能的重复利用

    1.3 模块导入规则

    python建议一行只导入一个模块 多个模块分多行导入

    1.4 模块导入顺序

    先导入内置的,再导入第三方的,再导入自己写的

    1.5 模块的命名空间

    模块有自己的命名空间

    1.6 import的用法

    #导入模块干了哪些事:

    #1 执行源文件

    #2 以一个源文件的全局名称空间

    #3 在当前位置拿到一个模块名,指向2创建的名称空间

     

    1.7 as起别名

     

    1.8 from...import

    #优点:使用源文件内的名字时无需加前缀,使用方便

    #缺点:容易与当前文件的名称空间内的名字混淆

    1.8.1 from...import

     

    1.8.2 from 模块名 import 名字 as 重命名

    如果你导入的模块过大,而你要用的功能很少''

    1.8.3 from 模块名 import *

    __all__*配合,__all__只能约束*,import *时列表里面加功能名

    __all__=[] 列表里面加字符串

     

    有文件用from my_module import *导入模块时,只能导入__all__列表里面的方法

    1.9 模块的搜索路径

    1.9.1 sys.modules

    可以通过sys.modules找的内存中已经加载了哪些写模块

     

    1.9.2模块的查找顺序

    模块的查找顺序是:内存中已经加载的模块->内置模块->sys.path路径中包含的模块

    python程序的修改必须重新加载才能生效,自定义的模块名一定不要与python自带的模块名重名

    1.9.3 sys.path

    #注意:自定义的模块名一定不要与python自带的模块名重名

    #内存中--》内置模块————》sys.path

    sys.path第一个值是执行文件的当前目录

     

    添加模块路径到环境变量

    import sys
    #print(sys.path)
    sys.path.insert(0,r'C:UsersAdministratorPycharmProjectspython18期周末班day5模块模块的搜索路径aaa')
    print(sys.path)

     

    1.10__name____main__

    区分python文件的两种用途

    用途一:当作脚本文件使用

    用途二:当作模块使用

    __name__:文件当作脚本运行时__name__等于__main__,文件当作模块被加载运行时__name__等于模块名

     

    所以在写模块脚本时可以加判断条件 if __name__ == '__main__':,这样就可以区分python模块与脚本的用法,写模块时应该这样写。

     

    1.11 relod()

    import importlib

    importlib.reload() 如果在导入模块后执行某个方法前修改了模块中的这个方法,用reload()这个方法可以立即导入修改的方法不需要重新导入模块,只能用于测试环境

     

    2、包

    2.1 注意

    1、无论是import形式还是from...import形式,凡是在导入语句中(而不是在使用时)遇到带点的,都要第一时间提高警觉:这是关于包才有的导入语法

    2. 包是目录级的(文件夹级),文件夹是用来组成py文件(包的本质就是一个包含__init__.py文件的目录)

    3. import导入文件时,产生名称空间中的名字来源于文件,import 包,产生的名称空间的名字同样来源于文件,即包下的__init__.py,导入包本质就是在导入该文件

    强调:

      1. python3中,即使包下没有__init__.py文件,import 包仍然不会报错,而在python2中,包下一定要有该文件,否则import 包报错

      2. 创建包的目的不是为了运行,而是被导入使用,记住,包只是模块的一种形式而已,包即模块,包是文件的集合

    2.2 __init.py__

    用执行文件执行__init.py__中导入的包时,路径以执行文件为准,所以要有from...import形式导入,执行文件导入包是实际执行包下面的__init__.py文件。

     

    2.3 绝对导入和相对导入

    当包内的文件要导入包内其他文件的时候,即如果包的模块之间存在引用关系:

    绝对路径的导入 :导入的路径会随着包与文件之间关系的变化而变化在包内部、外部都可以执行

    相对路径的导入 :一次写好的模块的导入关系,不需要关心模块和文件之间的关系只能在包的外面执行

    2.3.1 绝对导入

     

    2.3.2 相对导入

     

    3、项目开发规范

     

    3.1 bin

    bin目录中固定有一个start.py文件作为启动文件

    所有的代码以start.py为出发点 start.pycore里的core.py文件

    start.py开头固定写

    import os
    import sys
    BaseDir = os.path.dirname(os.path.dirname(os.getcwd()))
    sys.path.append(BaseDir)

    from ChoiceCourses.core import core
    core.main()

     

    os.getcwd()取当前文件路径

    os.path.dirname 取目录

    3.2 conf

    放配置文件

    3.3 core

    放核心文件,目录中要有一个core.py文件存放输入输出之类的代码或者字典

    在文件内调用其他模块用绝对路径

     

    包用相对路径 因为包是在外部调

    项目用绝对路径 因为项目在自己内部调

    3.4 db

    存放所有数据

    3.5 lib

    存放别人写的模块,不需要pip安装可以直接用的模块,非自己写的模块

    3.6 log

    存放日志文件

  • 相关阅读:
    Program C--二分
    Program A-归并排序
    Program E-- CodeForces 18C
    Program B--CodeForces 492B
    2015 HUAS Provincial Select Contest #1 C
    2015 HUAS Provincial Select Contest #1 B
    2015 HUAS Provincial Select Contest #1 A
    CSU 1111.三家人。第三次选拔赛D题:整理花园酬劳分配问题
    将10进制整数转换成16进制整数输出
    -UVa10935题:Trowing cards away1解答及简单分析
  • 原文地址:https://www.cnblogs.com/xiaojinyu/p/7581556.html
Copyright © 2020-2023  润新知