python进阶(二)导入import 机制 | 导入import 用法 工作原理全解析
文章目录
- 1. 整体概念基本介绍
- 1.1 包package
- 1.2 模块 module
- 2 基本语法
- 2.1 import直接使用
- 2.2 from 及其用法
- 3.1 as的用法
- 3 工作原理
- 3.1 搜寻
- 3.2 执行
- 3.3 避免导入模块代码执行
参考《Python应该如何导入(import)模块及包》梳理
1. 整体概念基本介绍
虽然简简单单的导入import,其实涉及到很多的知识
我们导入往往是一个包,或者包内的一个模块,或者一个模块内的某些函数变量等
所以我们先对,包,模块,函数、变量做一个简单介绍
他们的包含关系是
包package(往往是一个目录/文件夹)》模块module(往往是一个文件)》变量,函数,类
直观来说,一个包往往包含多个模块文件或者一些子包,每个模块文件包含多个变量和函数方法,类等
下面分别是更详细的介绍
1.1 包package
通常包是一个目录
为了将目录视为包,必须在其内部包含一个名为 __init__.py 的文件。__init__.py 文件可以为空,也可以包含包的初始化代码。
1.2 模块 module
通常模块为一个文件,直接使用import来导入就好了。可以作为module的文件类
一个模块内往往包括多个变量,函数
当然实际上可以导入的四种包括
- 使用Python写的程序( .py文件)
- C或C++扩展(已编译为共享库或DLL文件)
- 包(包含多个模块)
- 内建模块(使用C编写并已链接到Python解释器内)
2 基本语法
这里涉及到名字空间的概念,具体可以看我前一篇博客Python进阶(一)名字空间 | 超详细名字空间解析 内置 全局 局部 调试查看-CSDN博客
名字空间简单理解就是一个变量和值的映射关系
2.1 import直接使用
import直接导入模块,会创建一个新的导入模块名字空间,当前文件会引用这个导入模块的名字空间
import module_name
2.2 from 及其用法
我们可以使用 from 关键字指定需要引入的具体内容:
使用from语句可以将模块中的对象直接导入到当前的名字空间. from语句不创建一个到模块名字空间的引用,而是把被导入模块的一个或多个对象直接放入当前的名字空间:
from module_name import function_name, class_name
from语句支持逗号分割的对象,也可以使用星号*代表模块中除下划线开头的所有对象(注意这里导入是不会导入单下划线开头的变量)
from socket import * # 载入所有对象到当前名字空间
如果一个模块如果定义有列表__all__,则from module import * 语句只能导入__all__列表中存在的对象。
# module: foo.py
__all__ = [ 'bar', 'spam' ] # 定义使用 `*` 可以导入的对象
3.1 as的用法
也可以使用 as 关键字给模块或内容起别名:
import module_name as alias
另外, as 也可以和 from 联合使用:
from socket import gethostname as hostname
h = hostname()
3 工作原理
3.1 搜寻
现在有一个问题,就是导入的时候解释器会去哪里搜寻模块?
当我们使用 import 语句时,Python 解释器会在一系列目录中搜索模块(sys.path列表)这些目录包括当前目录(包含运行脚本的目录)、内置模块目录、环境变量 PYTHONPATH 中指定的目录等。
一个典型的sys.path 列表的值:
Linux:
[’’, ‘/usr/local/lib/python2.0’,
‘/usr/local/lib/python2.0/plat-sunos5’,
‘/usr/local/lib/python2.0/lib-tk’,
‘/usr/local/lib/python2.0/lib-dynload’,
‘/usr/local/lib/python2.0/site-packages’]
Windows:
[’’, ‘C:\WINDOWS\system32\python24.zip’, ‘C:\Documents and Settings\weizhong’, ‘C:\Python24\DLLs’, ‘C:\Python24\lib’, ‘C:\Python24\lib\plat-win’, ‘C:\Python24\lib\lib-tk’, ‘C:\Python24\Lib\site-packages\pythonwin’, ‘C:\Python24’, ‘C:\Python24\lib\site-packages’, ‘C:\Python24\lib\site-packages\win32’, ‘C:\Python24\lib\site-packages\win32\lib’, ‘C:\Python24\lib\site-packages\wx-2.6-msw-unicode’]
空字符串 代表当前目录. 要加入新的搜索路径,只需要将这个路径加入到这个列表.
3.2 执行
假设某源代码文件初次引入某一个模块
执行的具体步骤如下
- 1.为源代码文件中定义的对象创建一个模块名字空间,通过这个名字空间可以访问到模块中定义的函数及变量。
- 2.在新创建的名字空间里完整执行模块文件和源代码文件。
- 3.创建一个名为源代码文件的对象,该对象引用模块的名字空间,这样就可以通过这个对象访问模块中的函数及变量,如:
import spam # 导入并运行模块 spam
print (spam.a) # 访问模块 spam 的属性
spam.foo()
c = spam.bar()
import语句可以在程序的任何位置使用,你可以在程序中多次导入同一个模块,但模块中的代码 仅仅 在该模块被首次导入时执行。后面的import语句只是简单的创建一个到模块名字空间的引用而已。
这里我们注意到上面的第2点,一旦模块被导入,他的代码就会被执行一遍,但有些时候我不想让模块完整被执行,那么该怎么办呢?
3.3 避免导入模块代码执行
当一个模块被导入时,它的代码会被执行一次。如果你希望某些代码仅在模块被直接运行时而不是被导入时执行,可以使用 if __name__ == "__main__": 来进行条件判断。
if __name__ == "__main__":# 这里的代码仅在模块被直接运行时执行
如下所示是一个详细的例子
假设我们有一个名为 example_module.py 的模块文件,内容如下:
# example_module.pydef add_numbers(a, b):return a + b# 如果模块被直接运行,则执行以下代码(比如直接运行python example_module.py)
if __name__ == "__main__":x = 5y = 10result = add_numbers(x, y)print(f"The sum of {x} and {y} is: {result}")
在这个例子中,example_module.py 定义了一个简单的函数 add_numbers 用于相加两个数字。然后,在模块的末尾,使用 if __name__ == "__main__": 来判断模块是被导入还是被直接运行。如果模块被直接运行(比如直接运行python example_module.py),就会执行一些特定的代码,例如计算两个数字的和并打印结果。
现在,如果我们在另一个脚本another_script.py中导入这个模块,if __name__ == "__main__": 之后的代码就不会被执行。例如:
# another_script.pyimport example_moduleresult = example_module.add_numbers(8, 12)
print(f"The sum of 8 and 12 is: {result}")
会输出
The sum of 8 and 12 is: 20
在这个例子中,虽然我们导入了 example_module,但由于我们没有直接运行 example_module.py,因此 if __name__ == "__main__": 之后的代码不会执行。只有当 example_module.py 被直接运行时,才会执行这部分代码。
相关文章:
python进阶(二)导入import 机制 | 导入import 用法 工作原理全解析
文章目录 1. 整体概念基本介绍1.1 包package1.2 模块 module 2 基本语法2.1 import直接使用2.2 from 及其用法3.1 as的用法 3 工作原理3.1 搜寻3.2 执行3.3 避免导入模块代码执行 参考《Python应该如何导入(import)模块及包》梳理 1. 整体概念基本介绍 …...
极客时间-《罗剑锋的 C++ 实战笔记》文章笔记 + 个人思考
极客时间-《罗剑锋的 C 实战笔记》文章笔记 个人思考 语言特性06 | auto/decltype:为什么要有自动类型推导? 语言特性 06 | auto/decltype:为什么要有自动类型推导? auto 在C 11 引入。 为什么说C是静态强类型语言?…...
Pytorch 对比TensorFlow 学习:Day 17-18: 循环神经网络(RNN)和LSTM
Day 17-18: 循环神经网络(RNN)和LSTM 在这两天的学习中,我专注于理解循环神经网络(RNN)和长短期记忆网络(LSTM)的基本概念,并学习了它们在处理序列数据时的应用。 1.RNN和LSTM基础…...
Java基础 - 07 Set之Set,AbstractSet
上边几篇,我们对java的List集合进行相关介绍,了解了关于List集合下的相关实现类的方法或者接口。 自本篇开始,将围绕java的Set进行介绍,也是对我java知识的巩固吧,处理业务越多,发现自己对基础知识的薄弱&…...
C++17新特性(三)新的标准库组件
1. optional 在编程时,我们经常会遇到可能会返回/传递/使用一个确定类型对象的场景。也就是说,这个对象可能有一个确定类型的值也可能没有任何值。因此,我们需要一种方法来模拟类似指针的语义:通过nullptr表示指针为空。解决方法…...
Spring Boot入门
SpringBoot介绍 什么是SpringBoot Spring Boot是由Pivotal团队提供的全新框架,其中“Boot”的意思就是“引导”,Spring Boot 并不是对 Spring 功能上的增强,而是提供了一种快速开发 Spring应用的方式。 特点 • 嵌入的 Tomcat,…...
【LeetCode】数学精选4题
目录 1. 二进制求和(简单) 2. 两数相加(中等) 3. 两数相除(中等) 4. 字符串相乘(中等) 1. 二进制求和(简单) 从字符串的右端出发向左做加法,…...
【漏洞复现】Hikvision SPON IP网络对讲广播系统命令执行漏洞(CVE-2023-6895)
文章目录 前言声明一、系统简介二、漏洞描述三、影响版本四、漏洞复现五、修复建议 前言 Hikvision Intercom Broadcasting System是中国海康威视(Hikvision)公司的一个对讲广播系统。 声明 请勿利用文章内的相关技术从事非法测试,由于传播…...
IDEA在重启springboot项目时没有自动重新build
IDEA在重启springboot项目时没有自动重新build 问题描述 当项目里面某些依赖或者插件更新了,target的class文件没有找到,导致不是我们需要的效果。 只能手动的清理target文件,麻烦得很 , 单体项目还好说,一次清理就…...
华为设备NAT的配置
实现内网外网地址转换 静态转换 AR1: sys int g0/0/0 ip add 192.168.10.254 24 int g0/0/1 ip add 22.33.44.55 24 //静态转换 nat static global 22.33.44.56 inside 192.168.10.1 动态转换 最多有两台主机同时访问外网 AR1: sys int g0/0/0 ip add…...
48-DOM节点,innerHTML,innerText,outerHTML,outerText,静态获取,单机click,cssText
1.DOM基础 Document Object Module,文档对象模型,window对象,document文档,都可以获取和操作 1)文档节点 2)属性节点(标签内的属性href,src) 3)文本节点(标签内的文字) 4)注释节点 5)元素节点(标签) 2.获取元素节点 2.1通过标签名获取getElementsByTagName() …...
多输入多输出 | Matlab实现基于LightGBM多输入多输出预测
多输入多输出 | Matlab实现基于LightGBM多输入多输出预测 目录 多输入多输出 | Matlab实现基于LightGBM多输入多输出预测预测效果基本介绍程序设计参考资料 预测效果 基本介绍 Matlab实现基于LightGBM多输入多输出预测(完整源码和数据) 1.data为数据集&a…...
【欢迎您的到来】这里是开源库get_local_info作者的付费专栏
您好, 我是带剑书生,开源库get_local_info的作者,欢迎您的到来,这里是我的付费专栏,在上一个付费专栏里,用简洁的语言,通俗的话语,帮助您更好的学习了Rust,现在将用本专栏…...
Java SE入门及基础(23)
目录 方法带参 1. 构造方法带参 案例场景 思考:以上代码存在什么问题? 2. 方法带参 方法带参语法 案例场景 思考:以上代码存在什么问题? Java SE文章参考:Java SE入门及基础知识合集-CSDN博客 方法带参 1. 构造方法带参 …...
蓝桥杯回文日期判断
思想:对于回文数的判断方法,最快的就是取其中一半的字符串长度,为s,然后将其进行翻转为s’ ,再把两者进行拼接即可保证是回文数,这样子就解决了枚举所有回文数的问题。 注意点: 要求必须是有效…...
Qt文件和目录相关操作
1.相关说明 QCoreApplication类、QFile类、QDir、QTemporaryDir类、QTemporaryFile类、QFileSystemWatcher类的相关函数 2.相关界面 3.相关代码 #include "dialog.h" #include "ui_dialog.h" #include <QFileDialog> #include <QTemporaryDir>…...
递归、搜索与回溯算法(专题一:递归)
往期文章(希望小伙伴们在看这篇文章之前,看一下往期文章) (1)递归、搜索与回溯算法(专题零:解释回溯算法中涉及到的名词)【回溯算法入门必看】-CSDN博客 接下来我会用几道题&#…...
element-ui 打包流程源码解析(下)
目录 目录结构和使用1,npm 安装1.1,完整引入1.2,按需引入 2,CDN3,国际化 接上文:element-ui 打包流程源码解析(上) 文章中提到的【上文】都指它 ↑ 目录结构和使用 我们从使用方式来…...
ChatGPT给出的前端面试考点(Vue.js)
ChatGPT给出的前端面试考点(Vue.js) 答案 1. Vue.js是什么?它的主要特点是什么? Vue.js是一个渐进式JavaScript框架,用于构建用户界面。它的主要特点包括: 数据绑定:Vue.js使用双向数据绑定&…...
ChatGPT 商业提示词攻略书
原文:ChatGPT Business Prompt Playbook 译者:飞龙 协议:CC BY-NC-SA 4.0 一、书系介绍 人工智能发展迅速。非常迅速。 所以我希望你做两件事: (1) 在 Twitter 上关注我:iamkylebalmer (2) 订阅我的免费电子邮件通…...
(LeetCode 每日一题) 3442. 奇偶频次间的最大差值 I (哈希、字符串)
题目:3442. 奇偶频次间的最大差值 I 思路 :哈希,时间复杂度0(n)。 用哈希表来记录每个字符串中字符的分布情况,哈希表这里用数组即可实现。 C版本: class Solution { public:int maxDifference(string s) {int a[26]…...
vscode里如何用git
打开vs终端执行如下: 1 初始化 Git 仓库(如果尚未初始化) git init 2 添加文件到 Git 仓库 git add . 3 使用 git commit 命令来提交你的更改。确保在提交时加上一个有用的消息。 git commit -m "备注信息" 4 …...
Android Wi-Fi 连接失败日志分析
1. Android wifi 关键日志总结 (1) Wi-Fi 断开 (CTRL-EVENT-DISCONNECTED reason3) 日志相关部分: 06-05 10:48:40.987 943 943 I wpa_supplicant: wlan0: CTRL-EVENT-DISCONNECTED bssid44:9b:c1:57:a8:90 reason3 locally_generated1解析: CTR…...
PHP和Node.js哪个更爽?
先说结论,rust完胜。 php:laravel,swoole,webman,最开始在苏宁的时候写了几年php,当时觉得php真的是世界上最好的语言,因为当初活在舒适圈里,不愿意跳出来,就好比当初活在…...
微信小程序云开发平台MySQL的连接方式
注:微信小程序云开发平台指的是腾讯云开发 先给结论:微信小程序云开发平台的MySQL,无法通过获取数据库连接信息的方式进行连接,连接只能通过云开发的SDK连接,具体要参考官方文档: 为什么? 因为…...
全志A40i android7.1 调试信息打印串口由uart0改为uart3
一,概述 1. 目的 将调试信息打印串口由uart0改为uart3。 2. 版本信息 Uboot版本:2014.07; Kernel版本:Linux-3.10; 二,Uboot 1. sys_config.fex改动 使能uart3(TX:PH00 RX:PH01),并让boo…...
mysql已经安装,但是通过rpm -q 没有找mysql相关的已安装包
文章目录 现象:mysql已经安装,但是通过rpm -q 没有找mysql相关的已安装包遇到 rpm 命令找不到已经安装的 MySQL 包时,可能是因为以下几个原因:1.MySQL 不是通过 RPM 包安装的2.RPM 数据库损坏3.使用了不同的包名或路径4.使用其他包…...
使用Matplotlib创建炫酷的3D散点图:数据可视化的新维度
文章目录 基础实现代码代码解析进阶技巧1. 自定义点的大小和颜色2. 添加图例和样式美化3. 真实数据应用示例实用技巧与注意事项完整示例(带样式)应用场景在数据科学和可视化领域,三维图形能为我们提供更丰富的数据洞察。本文将手把手教你如何使用Python的Matplotlib库创建引…...
JavaScript 数据类型详解
JavaScript 数据类型详解 JavaScript 数据类型分为 原始类型(Primitive) 和 对象类型(Object) 两大类,共 8 种(ES11): 一、原始类型(7种) 1. undefined 定…...
基于Springboot+Vue的办公管理系统
角色: 管理员、员工 技术: 后端: SpringBoot, Vue2, MySQL, Mybatis-Plus 前端: Vue2, Element-UI, Axios, Echarts, Vue-Router 核心功能: 该办公管理系统是一个综合性的企业内部管理平台,旨在提升企业运营效率和员工管理水…...
