python进阶(二)导入import 机制 | 导入import 用法 工作原理全解析

这篇具有很好参考价值的文章主要介绍了python进阶(二)导入import 机制 | 导入import 用法 工作原理全解析。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。


参考《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.py

def add_numbers(a, b):
    return a + b

# 如果模块被直接运行,则执行以下代码(比如直接运行python example_module.py)
if __name__ == "__main__":
    x = 5
    y = 10
    result = 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.py

import example_module

result = 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 被直接运行时,才会执行这部分代码。文章来源地址https://www.toymoban.com/news/detail-806124.html

到了这里,关于python进阶(二)导入import 机制 | 导入import 用法 工作原理全解析的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • “深入解析JVM内部机制:理解Java虚拟机的工作原理“

    标题:深入解析JVM内部机制:理解Java虚拟机的工作原理 摘要:本文将深入探讨Java虚拟机(JVM)的内部机制,解释其工作原理。我们将讨论JVM的组成部分、类加载过程、运行时数据区域以及垃圾回收机制。此外,还将通过示例代码来说明JVM的内部工作机制。 正文: JVM的组成

    2024年02月13日
    浏览(48)
  • “深入探索JVM内部机制:解析Java虚拟机的工作原理“

    标题:深入探索JVM内部机制:解析Java虚拟机的工作原理 摘要:本文将介绍Java虚拟机(JVM)的工作原理,包括类加载、内存管理、垃圾回收和字节码执行等方面。通过深入理解JVM的内部机制,开发人员可以更好地优化代码性能,提高应用程序的可靠性和可扩展性。 正文: 一

    2024年02月11日
    浏览(50)
  • 【Spring底层原理高级进阶】轻松掌握 Spring MVC 的拦截器机制:深入理解 HandlerInterceptor 接口和其实现类的用法

     🎉🎉欢迎光临🎉🎉 🏅我是苏泽,一位对技术充满热情的探索者和分享者。🚀🚀 🌟特别推荐给大家我的最新专栏 《Spring 狂野之旅:底层原理高级进阶》 🚀 本专栏纯属为爱发电永久免费!!! 这是苏泽的个人主页可以看到我其他的内容哦👇👇 努力的苏泽 http://suze

    2024年02月20日
    浏览(52)
  • python包导入原理解析

    原文链接: https://www.cnblogs.com/hi3254014978/p/15317976.html 根据编程经验的不同,我们在运行程序时可能经常或者偶尔碰到下面这些问题,仔细观察后会发现这些问题无一例外都出现了一个相同的短语,很容易就可以发现,这个短语就是\\\"relative import\\\"。 既然关于相对导入的报错提示

    2024年02月07日
    浏览(31)
  • HTTP与HTTPS:深度解析两种网络协议的工作原理、安全机制、性能影响与现代Web应用中的重要角色

    HTTP (HyperText Transfer Protocol) 和 HTTPS (Hypertext Transfer Protocol Secure) 是互联网通信中不可或缺的两种协议,它们共同支撑了全球范围内的Web内容传输与交互。本文将深度解析HTTP与HTTPS的工作原理、安全机制、性能影响,并探讨它们在现代Web应用中的核心角色。 HTTP 是一种应用层协议

    2024年04月11日
    浏览(60)
  • 区块链工作原理,工作机制和详细概念

     各位小伙伴想要博客相关资料的话,关注公众号:chuanyeTry即可领取相关资料! 工作原理         区块链是一种去中心化的分布式账本技术,它的工作原理可以简单概括为以下几个步骤:         1. 交易:区块链中的交易可以是任何数字化的价值交换,例如加密货币

    2024年02月09日
    浏览(53)
  • 如何将Python的上级目录的文件导入?【from.import】

    假如有如下目录: -python ----file1 ---------file1_1 ------------------pfile1_1.py ---------pfile1.py ----file2 ---------pfile2.py ----pfile.py ----data.py 在pfile1_1.py中想要将pfile.py 导入怎么办? 将上级文件目录标记为:源代码的根目录。 将所有from和import都设置为绝对路径即可。 如果不想改代码的话还有

    2024年02月09日
    浏览(49)
  • kafka的ISR工作机制原理

    昨日内容回顾:     - ES的加密及客户端的连接方式,比如logstash,filebeat,curl,es-head,postman...     - zk单点部署     - kafka单点部署     - kafka的集群扩容     - kafka集群架构     - kafka的堆内存调优     - kafka的集群宏观架构      Q1: 为什么需要配置\\\"dvertised.listeners\\\".  

    2024年02月10日
    浏览(49)
  • postman的工作原理与基本用法

           postman是一个用于调试HTTP请求的工具,有友好的界面助于分析、构造HTTP请求并分析响应数据。在实际工作中开发和测试基本都用这款工具进行接口调试。        postman的工作原理可以理解成一个浏览器,可模拟浏览器、APP原生等客户端向服务器发送接口请求,并获取

    2024年02月06日
    浏览(34)
  • Qt——Qt工作原理:事件驱动、信号与槽机制

    Qt作为一个现代的GUI(图形用户界面)框架,采用了事件驱动的编程范式,并引入了信号与槽机制,以实现高度交互和松耦合的程序设计。下面详细解释了相关概念,以及如何在Qt中使用它们。 事件是在GUI应用程序中的控件上产生的各种动作、操作或状态变化,例如鼠标移动

    2024年02月10日
    浏览(42)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包