Python 模块架构


文章目录

  • Python 模块架构
  • 一、最基础的模块调用
  • 二、目录“__ pycache__”
  • 三、使用“__ name__”属性

  因为Python是一门面向对象的编程语言,所以也遵循了模块架构程序的编程原则。


一、最基础的模块调用

  在前面的文章中,已经详细了解了和模块化开发相关的基本知识,例如在下面的实例中,演示了在程序中调用外部模块文件的过程:

import math         #导入math模块,math模块是标准库中的,所以不用安装,可以直接使用
from math import sqrt       #从math模块中导入sqrt()函数
import math as shuxue       #导入math模块,并将此模块命名为shuxue
print("下面是数学函数:")
print("调用math.sqrt:\t",math.sqrt(9))        #调用math模块中的调用sqrt()函数
print("直接调用sqrt:\t",sqrt(4))        #直接调用sqrt()函数
print("调用shuxue.sqrt:\t",shuxue.sqrt(6))        #等价于调用math模块中的调用sqrt()函数

  在上述代码中,分别使用三种不同的方式导入了math模块或其中的函数,然后分别以三种不同的方式导入对象。虽然被导入的都是同一个模块或模块中的内容(都是调用了系统内置函数中的math.sqrt()方法),但相互之间并不冲突。执行结果是:

  在Python程序中,不能随便导入编写好的外部模块,只有被Python找到的模块才能被导入。如果自己编写的外部模块文件和调用文件处于同一个目录中,那么可以不需要特殊设置就能被Python找到并导入。但是如果两个文件不在同一个目录呢?例如下面的实例中分别编写了外部调用模块文件module_test.py和测试文件but.py,但是这两个文件不是在同一个目录中。
外部模块module_test.py的具体实现代码如下:

print("导入的测试模块的输出")
name ="module_test"
def m_t_pr():print("模块module_test中的m_t_pr()函数")

在测试文件but.py中,调用模块代码如下:

import module_test
module_test.m_t_pr()
print("使用外部模块“module_test”中的变量:",module_test.name)

如果上述两个文件在同一个目录中,如图所示:

执行后输出:

  如果在文件but.py所在目录中新建一个名为module的目录,然后把文件module_test.py保存到module目录中,再次运行文件but.py会引发报错:

二、目录“__ pycache__”

  如果外部模块文件 module_test.py和测试文件but.py在同一个目录中,运行成功后会在本目录中生成一个名为“pycache_”的文件目录,这个目录下还有一个名为“module test cnrthon-38.pyc”的文件。如图所示:

  文件 module_test.cpython-38.pyc是一个可以直接运行的文件,这是 Python将文件module_test.py编译成字节码后的文件,Python可以将程序编译成字节码的形式。对于外部模块文件来说,Python总是在第一次调用后将其编译成字节码的形式,以提高程序的启动速度。
  Python程序在导入外部模块文件时会查找模块的字节码文件,如果存在则将编译版后的模块的修改时间同模块的修改时间进行比较。如果两者的修改时间不同,Python会重新编译这个模块,目的是确保两者的内容
容相符。
  在开发Python程序过程中,如果不想将某个源文件发布,此时可以发布编译后的程序(例如上面的文件 module_test.cpython-36.pyc),这样可以起到一定的保护源文件的作用。对于不作为模块来使用的Python程序来说,Python不会在运行脚本后将其编译成字节码的形式。如果想将其编译,可以使用compile模块实现。
例如在下面的实例代码中,将文件mokuai.py进行了编译操作。

import py_compile       #调用系统内置模块py_compile
py_compile.compile("mokuai.py","mokuai.py")     #调用内置函数mokuai()

  在上述代码中,首先使用import语句调用系统内置模块py_compile,然后调用里面的内置库函数compile(),将同目录下的文件mokuai.py编译成文件mokuai.pyc。执行后将会在同录下生成一个名为“mokuai.pvc”的文件,如图所示:

  在Python 3语法规范中规定,如果在方法py_compile.compile中不指定第二个参数,则会在当前目录中新建一个名为“pycache”的目录,并在这个目录中生成如下格式的pyc字节码文件。

被编译模块名.cpython-38.pyc

  运行文件mouai.pyc后,和单独运行文件mokai.py的执行效果是相同的,编译后生成的文件mokuai.pyc并没有改变程序功能,只是以Python字节码的形式存在而已,起到了个保护源码不被泄露的作用。
  除此之外,还可以使用Python命令行选项实现脚本编译。通常有如下两个Python编译的优化选项。
  ●-O:该选项对脚本的优化程度不大,编译后的脚本以".pyo"格式为扩展名。凡是以".pyo"为扩展名的Python字节码都是经过优化处理的。
  ●-OO:该选项对脚本优化处理的程度较大,使用这个选项标志可以使编译后的Python脚本变得更小。但是在使用该选项时可能会导致脚本运行错误,读者需要谨慎使用这个选项。
例如可以通过如下命令行编译成pyo文件。

python -O -m py_ compile file.py

  在上述命令行中,其中的“-m”相当于脚本中的import,这里的“-m py_compil”相当于"import py_ compile"。 如果将上面的“-O”改成“-OO”,则表示删除相应的pyo文件,具体帮助信息可以在控制台中输入“python-h” 命令查看。

三、使用“__ name__”属性

  在Python程序中,当一个程序第一次引入一个模块时, 将会运行主程序。如果想在导入模块时不执行模块中的某一个程序块,可以用“__ name__ ” 属性使该程序块仅在该模块自身运行时执行。在运行每个Python程序时,通过对这个“__ name__ ” 属性值的判断,可以让作为导入模块和独立运行时的程序都可以正确运行。在Python程序中,如果程序作为一个模块被导入, 则其“__ name__”属性设置为模块名。如果程序独立运行,则将其“__ name__”属性设置为“main”。由此可见,可以通过属性“__ name__”来判断程序的运行状态。
例如在下面的实例代码中,演示了使用“__ name__”属性设置测试模块是否能正常运行的过程。

实例文件using_ name.py 的具体实现代码如下所示。

if __name__ == '__main__':      #将"__name__"属性与" __main__”比较print('三体飞船在运行')        #程序自身在运行,仅在该模块自身运行时执行
else:print('我来自另一模块')        #如果程序是作为一个模块被导入

  在上述代码中,将模块的主要功能以实例的形式保存在if语句中,这样可以方便地测试模块是否能够正常运行,或者发现模块的错误。执行后会显示“三体飞船在运行”,如果输入“import using_ name”,按下回车后则输出“我来自另一模块”。执行后会输出:

  注意:建议读者在命令行模式运行[python using _name.py]命令查看完整运行结果,后面的交互式实例也不例外。   如果想了解模块中所提供的功能(变量名、函数名),可以使用内建的函数dir (模块名)来输出模块中的这些信息,当然也可以不使用模块名参数来列出当运行时中的模块信息。例如可以通过“dir(using. name)”列出模块“using. name”中的信息。

自学Python 29 模块架构相关推荐

  1. numpy randn 和_人生苦短,自学python——numpy模块

      numpy.pandas.matplotlib.sklearn是python机器学习领域,最核心的几个模块,玩转了这几个模块也就玩转了机器学习,其中,numpy又是这几个模块中最基础的模块. 内置 ...

  2. python 调用另一个py_跟我自学python 第9章 类(9.4.6 在一个模块中导入另一个模块)...

    大家好今天学习9.4.6 在一个模块中导入另一个模块 .今天我们继续学习python.马上类就学完了. 喜欢python就关注冠山巡山使. 我将跟大家一块自学完python语言. 9.4.6 在一个模 ...

  3. Python自学——python的常用模块

    Python学习--python的常用模块 原文作者:佛山小程序员 原文链接:https://blog.csdn.net/weixin_44192923/article/details/8656325 ...

  4. 孤荷凌寒自学python第七十九天开始写Python的第一个爬虫9并使用pydocx模块将结果写入word文档...

    孤荷凌寒自学python第七十九天开始写Python的第一个爬虫9 (完整学习过程屏幕记录视频地址在文末) 今天在上一天的基础上继续完成对我的第一个代码程序的书写. 到今天终于完成了对docx模块针对 ...

  5. 自学Python第九天- 模块、包、编码、文件操作、OS 模块、打包

    自学Python第九天- 模块.包.编码.文件操作.OS 模块.打包 模块 导入模块 程序入口 包 编码 文件操作 打开或创建文件 常用的文件打开模式 边读边写 文件对象的常用方法 读写 CSV Ex ...

  6. 自学Python第十四天- 一些有用的模块:urllib、requests 网络编程基础,向爬虫靠拢

    自学Python第十四天- 一些有用的模块:urllib.requests 网络编程基础,向爬虫靠拢 fake_useragent 库 安装 fake_useragent 使用 urllib 库 ur ...

  7. 孤荷凌寒自学python第四十五天Python初学基础基本结束的下阶段预安装准备

    孤荷凌寒自学python第四十五天Python初学基础基本结束的下阶段预安装准备 (完整学习过程屏幕记录视频地址在文末,手写笔记在文末) 今天本来应当继续学习Python的数据库操作,但根据过去我自学 ...

  8. 美国AI博士指出,自学Python到底能做什么

    我见过市面上很多的 Python 讲解教程和书籍,他们大都这样讲 Python 的: 先从 Python 的发展历史开始,介绍 Python 的基本语法规则,Python 的 list, dict, ...

  9. 零基础该如何系统地自学Python编程?五个阶段带你从小白到大佬

    对于零基础学习或是已经学完基础不知道下一步该干什么的朋友,可以看看这篇缓解迷茫.今天分享下如何系统地自学Python规划目标,有一个学习目标在去行动. 有了目标,怎么行动呢?建议采用视频+书籍的方式进 ...

最新文章

  1. 什么时候用redis_C++传参什么时候用引用, 什么时候用指针?
  2. linux 文件拷贝io,NIO拷贝文件真的比IO拷贝文件效率高?
  3. 你绝对能懂的“机器学习”(一)
  4. Ajax获取数据的流程
  5. 前端学习(2695):重读vue电商网站16之Upload 上传组件
  6. Client.Timeout exceeded while awaiting headers
  7. ubuntu 9.10安装jdk1.5
  8. 10分钟搭建商品结算平台!商品、车辆识别一网打尽
  9. API接口的安全设计验证:ticket,签名,时间戳
  10. 【渝粤题库】陕西师范大学209015公共经济学作业(高起本、专升本)
  11. 解决 Hbuilder打包 Apk pad 无法横屏 以及 H5 直接打包 成Apk
  12. typort快捷键+常用表情+画图
  13. react加水印_图片添加水印
  14. mysql复制不了的文字怎么办_网页上的文字不能复制怎么办?
  15. Norgen痰液液化缓冲液解决方案
  16. 使用监听器实现一个统计网站在线人数的示例
  17. Java 基础学习(9)
  18. 直流电源线缆 高速电缆 分类
  19. 空间射线与三角形相交算法的两种实现
  20. MapReduce学习之概述和设计构思

热门文章

  1. K3Wise对接(上传销售出库单 字段对应和细节说明)
  2. HomeKit独一家?米家、华为HiLink涿鹿群雄?不妨看看这款新晋品牌
  3. 《惢客创业日记》2019.07.04(周四)以德报怨,何以报德?
  4. .计算机辅助管理,文档计算机辅助管理系统
  5. 怎么删除win10系统的更新缓存文件?
  6. 跟锦数学171217-180630
  7. 图片懒加载(lazyload)的几种方式
  8. PubMed(丁香)英汉词典爬取
  9. 链路聚合(动态捆绑链路)、负载均衡详解、全双工与半双工区别、LACP优先级详解(附图)
  10. 东南大学计算机考研面试题,东南大学研究生面试经验