第六篇 模块基础

目录

  • 第六篇 模块基础

    • 一 模块的四种形式
    • 二 import和from...import
    • 三 循环导入问题
    • 四 模块的搜索路径
    • 五 python文件的两种用途
    • 六 包

第六篇 模块基础

一 模块的四种形式

  1. 啥是模块

    模块是一系列功能的集合体,而函数是某一功能的集合体,因此模块可以看成是一堆函数的集合体。一个py文件内部就可以放一堆函数,因此一个py文件就可以看成一个模块。如果这个py文件的文件名为module.py,模块名则是module。

  2. 模块的四种形式

    2.1 自定义模块:如果你自己写一个Py文件,在文件内写入一堆函数,则它被称为自定义模块,即使用python编写的.py文件

    2.2 第三方模块:已被编译为共享库或DLL的或C++扩展

    2.3 内置模块:使用C编写并连接到python解释器的内置模块

    2.4 包:把一系列模块组织到一起的文件夹(注:文件夹下有一个__init__.py文件,该文件夹称之为包。

  3. 为啥使用模块

    3.1 用第三方或者内置的模块是一种拿来主义,可以极大地提升开发效率

    3.2 自定义模块,将我们自己程序中用到的公共功能,写入一个python文件,然后程序的各部分组件可以通过导入的方式来引用自定义模块的功能。

  4. 如何用模块

    一般我们使用import和from...import导入模块

二 import和from...import

  1. import模块名

    import首次导入模块发生了3件事:

    1.1以模块为准创造一个模块的名称空间

    1.2执行模块对应的文件,将执行过程中的名字都丢到模块的名称空间

    1.3在当前执行文件中拿到一个模块名

    模块的重复导入会直接引用之前创造好的结果,不会重复执行模块的文件,即重复导入会发生:spam=spam=模块名称空间的内存地址、

  2. from模块名import具体的功能

    from...import...首次导入模块发生了3件事:

    2.1 以模块为准创造一个模块的名称空间

    2.2执行模块对应的文件,将执行过程中产生的名字都丢到模块的名称空间

    2.3 在当前执行文件的名称空间中拿到一个名字,改名字直接指向模块中的某一个名字,意味着可以不用加任何前缀而直接使用。

    优点:不用加前缀,代码更加精简

    缺点:容易与当前执行文件中名称空间中的名字冲突

  3. import和from.....import的异同

    相同点:

    1. 两者都会执行模块对应的文件,两者都会产生模块的名称空间
    2. 两者调用功能时,需要跑到定义时寻找作用域关系,与调用位置无关

    不同点:

    ? import需要加前缀,from import不用加前缀。

三 循环导入问题

模块m1和m2相互导入,此时可能会出现一种情况:

m1从m2导入的名称是在m2中的导入m1语句下面定义的

m2从m1导入的名称是在m1中的导入m2语句下面定义的

因而m1和m2中的导入语句都找不到目标名称,就像陷入了循环一样,都不会执行下面的代码

==解决方法==

  1. 在import语句之前定义目标函数
  2. 在函数体导入,因为函数只检测语法,不执行代码

四 模块的搜索路径

模块搜索路径顺序
  1. 先从内存中已经导入的模块中寻找
  2. 内置的模块
  3. 环境变量sys.path中找

强调:sys.path的第一个值是当前执行文件的所在文件夹

五 python文件的两种用途

  1. 执行文件

    脚本:一个文件就是整个程序,用来被执行

  2. 当作模块导入

    模块:文件中存放着一堆功能,用来被导入使用

六 包

啥是包

包是模块的一种形式,包的本质就是一个含有.py的文件或文件夹。

为啥使用包

为了方便模块设计者对模块的管理,维护方便。因此我们可以使用包来扩展模块的功能

使用方法

==导入模块发生的三件事==

  1. 创建一个包的名称空间
  2. 执行py文件,将执行过程中产生的名字存放于名称空间中。
  3. 在当前执行文件中拿到一个名字aaa,aaa是指向包的名称空间

==导入包发生的三件事==

  1. 创建一个包的名称空间
  2. 由于包是一个文件夹,无法执行包,因此执行包下的.py文件,将执行过程中的名字存放于名称空间中(即包名称中存放的名字都是来自于.py)
  3. 在当前执行文件中拿到一个名字aaa,aaa是指向包的名称空间的

==导入包就是在导入包下是.py,并且可以使用以下两种方式导入==

  1. import
  2. from import

==绝对导入和相对导入==

绝对导入:

# aaa/.py
from aaa.m1 import func1
from aaa.m2 import func2

相对导入:

  1. .代表当前被导入我呢见加所在的文件夹
  2. ..代表当前被导入文件治所在的文件夹的上一级
  3. ...代表当前被导入文件所在的文件夹的上一级的上一级
注意事项
  1. 包内所有的我呢见都是被导入使用的,而不是被直接运行的
  2. 包内部模块之间的导入可以使用绝对导入(以包的根目录为基准)与相对导入(以当前被导入的模块所在的目录为基准),推荐使用相对导入
  3. 当文件是执行文件时,无法在该文件内用相对导入的语法,只有在文件时被当作模块导入时,该文件内才能使用相对导入的语法
  4. 凡是在导入时带点的,点的左边都必须是一个包。

原文地址:https://www.cnblogs.com/zhulipeng-1998/p/11743525.html

时间: 2024-11-05 12:08:52

第六篇 模块基础的相关文章

黑马程序员系列第六篇 面向对象基础

ASP.Net+Android+IOS开发  .Net培训.期待与您交流! (前言:本篇文章主要依据毕向东老师的课程视频整理而成,如要详细学习,请观看毕老师视频  百度网盘链接地址:http://pan.baidu.com/s/1mgngVl2) 目录:1.面向对象三大特性    2.类和对象    3.内部类   1.面向对象三大特性    封装.继承.多态 封装 概念:是指隐藏对象的属性和实现细节,仅对外提供公共访问方式. 好处:将变化隔离:便于使用:提高重用性:安全性. 封装原则:将不需要

Python之路【第十六篇】:Django【基础篇】

Python之路[第十六篇]:Django[基础篇] Python的WEB框架有Django.Tornado.Flask 等多种,Django相较与其他WEB框架其优势为:大而全,框架本身集成了ORM.模型绑定.模板引擎.缓存.Session等诸多功能. 基本配置 一.创建django程序 终端命令:django-admin startproject sitename IDE创建Django程序时,本质上都是自动执行上述命令 其他常用命令: python manage.py runserver

Windbg CLR基础小测 《第六篇》

首先写一段代码如下: namespace ConsoleApplication3 { class Program { static void Main(string[] args) { Console.WriteLine("Hello, Windbg!"); Console.ReadKey(); } } } 在Debug目录中启动该程序,然后在Debug中附加该进程. 0:007> .load C:/WINDOWS/Microsoft.NET/Framework/v4.0.303

NHibernate 组件基础 (第六篇)

NHibernate 组件基础 (第六篇) 一.组件简介 组件(Component)可以理解为被一个对象所包含的对象而持久化,而并非一个实体.简单说来,假如数据库有FirstName,LastName这两个字段,我们在C#中可以将这两个字段提取出来作为一个Name对象使用. 示例,首先建一张表,并添加数据如下: Person.hbm.xml <?xml version="1.0" encoding="utf-8" ?> <hibernate-map

Python之路【第六篇】:socket

Python之路[第六篇]:socket Socket socket通常也称作"套接字",用于描述IP地址和端口,是一个通信链的句柄,应用程序通常通过"套接字"向网络发出请求或者应答网络请求. socket起源于Unix,而Unix/Linux基本哲学之一就是"一切皆文件",对于文件用[打开][读写][关闭]模式来操作.socket就是该模式的一个实现,socket即是一种特殊的文件,一些socket函数就是对其进行的操作(读/写IO.打开.关闭

第3篇-JAVA基础

第3篇-JAVA基础 每篇一句 :目标是给梦想一个期限,行动与坚持就是实现梦想的过程 初学心得: 遇到困难或问题,它不是休止符,而是引向你如何解决问题的标识 (笔者:JEEP/711)[JAVA笔记 | 时间:2017-03-26| JAVA基础 Ⅱ] 上篇回顾 上篇文章中我们学习了JAVA底层的运行机制与深入剖析以及解释其中JAVA基础代码的含义 本篇文章将JAVA基础Ⅱ全面剖析解释,因为JAVA基础非常重要,务必要牢记知识点!!! 1.JAVA基础语法格式 JAVA采用unicode编码 1

ElasticSearch入门 第六篇:复合数据类型——数组,对象和嵌套

这是ElasticSearch 2.4 版本系列的第六篇: ElasticSearch入门 第一篇:Windows下安装ElasticSearch ElasticSearch入门 第二篇:集群配置 ElasticSearch入门 第三篇:索引 ElasticSearch入门 第四篇:使用C#添加和更新文档 ElasticSearch入门 第五篇:使用C#查询文档 ElasticSearch入门 第六篇:复合数据类型——数组,对象和嵌套 在ElasticSearch中,使用JSON结构来存储数据,

第六篇 SQL Server安全执行上下文和代码签名

本篇文章是SQL Server安全系列的第六篇,详细内容请参考原文. SQL Server决定主体是否有必要的执行代码权限的根本途径是其执行上下文规则.这一切都可能复杂一个主体有执行代码的权限,但是却没有访问代码中基础对象的权限,比如表中的数据.这一篇将探讨SQL Server的执行上下文.所有权链接和模拟,以及告诉你如何通过T-SQL代码控制访问数据.执行上下文当用户执行一个存储过程或其他数据库代码,SQL Server检查以确保用户不但有执行过程权限,而且有代码访问的数据库对象的权限.如果没

第十六篇 人类世界

第十六篇  人类世界 人类世界是一个快速发展的世界.在这个宇宙中人类物种出现的时间并不算很长,随着大宇宙的发展,在宇宙经历了多次调整①之后,人类物种是在宇宙发展需要的情况下才被创造的,可以说我们人类物种算是出现在一个非常好的时间点上. 也就是说,人类物种在被创造之前已经有很多高智慧物种为人类打下了良好的基础,这些基础能够让人类这个物种在宇宙中得到快速的发展.如果没有这样的基础,人类世界也不会发展得如此庞大. 人类带着创造者的期待与信任出现在这个宇宙中,开始了人类生命的历程.由于人类这个物种肩负着