前后端知识库 前后端知识库
首页
    • JavaScript
    • React
    • Vue
  • Python
  • Sanic
  • Linux
  • Ansible
归档
GitHub (opens new window)
首页
    • JavaScript
    • React
    • Vue
  • Python
  • Sanic
  • Linux
  • Ansible
归档
GitHub (opens new window)
  • Sanic

  • Python

    • Python 的动态类型介绍
    • 数字类型
    • Set类型
    • 字符串
    • 列表
    • 元组
    • 通用序列
    • 字典
    • 文件
    • 语句和语法
    • 赋值语句
    • 打印
    • if语句
    • loop循环
    • 迭代器和生成器
    • 文档
    • 函数
    • 作用域
    • 参数
    • 函数的高级特性
    • 模块
    • 模块包
    • 模块高级用法
    • 类 class
    • Python命名空间
    • 运算符重载
    • 类的设计模式
    • 类的高级主题
    • 异常
    • 异常对象
    • Unicode与字节串
    • 管理属性
    • 装饰器
    • 元类
    • 执行细节
  • backend
  • Python
devin
2023-09-09

模块

# /img/python/

1.从实际角度,/img/python/对应 Python 程序文件(或者用外部语言如 C|C#编写的扩展)。从逻辑上看,/img/python/是最高级别的程序组织单元

  • 每个 Python 程序文件都是一个/img/python/

  • /img/python/导入另一个/img/python/后,可以直接使用被导/img/python/定义的全局变量名
    /img/python/

    2.Python 程序是作为一个主体的、顶层文件来构造,配合零个或者多个支持的/img/python/文件

    3.Python 自带了很多/img/python/,称为标准链接库。他们提供了很多常用功能

    4.导入/img/python/用import。其通用格式为import modname。其中modname为/img/python/名,它没有文件后缀名.py,也没有文件路径名。
    导入并非是 C 语言的#include。导入其实是运行时的运算。程序首次导入一个/img/python/时,执行三个步骤:

  • 找到/img/python/文件

  • 编译成字节码(即.pyc文件)。如果字节码文件不存在或者字节码文件比源代码文件旧, 则执行该步骤。否则跳过该步骤直接加载字节码

  • 执行/img/python/代码来创建其定义的对象

在这之后导入相同/img/python/时,会跳过这三步而只是提取内存中已经加载的/img/python/对象。

从内部看,Python 将加载的/img/python/存储到一个名为sys.modules的字典中,键就是/img/python/名字符串。在每次导入/img/python/开始时都检查这个字典,若/img/python/不存在则执行上述三步。

/img/python/导入过程

5.当文件import时,会进行编译产生字节码文件.pyc,因此只有被导入文件才会在机器上留下.pyc文件。顶层文件的字节码在内部使用后就丢弃了,并未保留下来。

顶层文件通常设计成直接执行,而不是被导入的

6.Python /img/python/文件搜索路径:

  • 程序主目录
  • 环境变量PYTHONPATH指定的目录
  • 标准链接库目录(这个一般不动它)
  • 任何.pth文件的内容,其中.path文件在前三者中查找到的。

    Python 会将每个.pth文件的每行目录从头到尾添加到sys.path列表的最后 (在此期间 Python 会过滤.pth文件中目录列表中重复的和不存在的目录)

以上四者优先级从高到低。这四部分组合起来就是sys.path列表的内容
sys.path

7.sys.path列表就是/img/python/的搜索路径。Python 在程序启动时配置它,自动将顶级文件的主目录(或代表当前工作目录的一个空字符串)、环境变量PYTHONPATH指定的目录、标准库目录以及已创建的任何.pth文件的内容合并

  • /img/python/搜索时,从左到右搜索sys.path,直到第一次找到要import的文件

    8.import/img/python/时,省略文件后缀名因为/img/python/可能是.py文件、.pyc文件,或者扩展的 C /img/python/等。

    9.创建/img/python/:任何保存为.py文件的文件均被自动认为是 Python /img/python/。所有该/img/python/顶层指定的变量均为/img/python/属性。

    可执行但不会被导入的顶层文件不必保存为.py 文件

  • 因为/img/python/名在 Python 中会变成变量名,因此/img/python/名必须遵守普通变量名的命名规则

    10.import和from语句:

  • import使得一个变量名引用整个/img/python/对象:import module1

  • from将一个变量名赋值给另一个/img/python/中同名的对象:from module1 import printer。在本/img/python/内printer名字引用了module1.printer对象

  • from *语句将多个变量名赋值给了另一个/img/python/中同名的对象:from module1 import *。在本/img/python/内,所有module1.name对象赋值给了name变量名
    import与from语句

有几点需要注意:

  • from语句首先与import一样导入/img/python/文件。但它多了一步:定义一个或多个变量名指向被导入/img/python/中的同名对象

  • from与import都是隐性赋值语句

  • from与import对本/img/python/的命名空间影响不同:from会在命名空间中引入from import的变量名而不会引入/img/python/名, import会在命名空间中引入/img/python/名
    import与from语句

  • from、import与def一样是可执行语句,而不是编译器声明

  • 当出现交叉导入时,可以使用import ,用from可能出现死锁的问题:modA需要from import modB的变量 ,而此时modB也在from import modA的变量 import与from语句

    11.要修改被导入的全局变量,必须用import,然后用/img/python/名的属性修改它;不能用以from隐式创建的变量名来修改。
    修改/img/python/属性

    12.用from时,被导入/img/python/对象并没有赋值给变量名:

  • import module1:module1既是/img/python/名,也是一个变量名(引用被导入/img/python/对象)

  • from module1 import func:module1仅仅是/img/python/名,而不是变量名
    /img/python/名与变量名

    13.from语句陷阱:

  • from语句可能破坏命名空间

  • from后跟随reload时,from导入的变量名还是原始的对象

    14./img/python/的命名空间可以通过属性.__dict__或者dir(modname)来获取

  • 在 Python 内部,/img/python/命名空间是作为字典对象存储的

  • 我们在/img/python/文件中赋值的变量名在 Python 内部称为命名空间字典的键
    /img/python/命名空间

    15.一个/img/python/内无法使用其他/img/python/内的变量,除非明确地进行了导入操作

    17.重载函数reload():它会强制已加载的/img/python/代码重新载入并重新执行

  • reload函数可以修改程序的一部分,而无需停止整个程序

  • reload函数只能用于 Python 编写的/img/python/,而无法用于其它语言编写的扩展/img/python/
    reload函数

    18.reload()与import和from的差异:

  • reload是 Python 内置函数,返回值为/img/python/对象,import与from是语句

  • 传递给reload是已经存在的/img/python/对象,而不是一个变量名

  • reload在 Python3.0 中位于imp标准库/img/python/中,必须首先导入才可用。

    19.reload工作细节:

  • reload并不会删除并重建/img/python/对象,它只是修改/img/python/对象。即原来/img/python/的每个属性对象内存空间还在,所有旧的引用指向他们,新的引用指向修改后的属性对象内存空间

  • reload会在/img/python/当前命名空间内执行/img/python/文件的新代码

  • reload会影响所有使用import读取了/img/python/的用户,用户会发现/img/python/的属性已变

  • reload只会对以后使用from的代码造成影响,之前用from的代码并不受影响。之前的名字还可用,且引用的是旧对象
    reload与import、from

编辑 (opens new window)
上次更新: 2023/09/09, 12:09:00
函数的高级特性
模块包

← 函数的高级特性 模块包→

Theme by Vdoing | Copyright © 2023-2023 devin | MIT License
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式