模块简介/模块的导入/模块的查找顺序/绝对导入和相对导入/软件开发目录规范...

一.模块的简介

  什么是模块:

    模块就是一系列功能的结合体

  模块的三种来源:

    1.内置的

    2.第三方的 

    3.自定义的

  模块的四种表现形式:

    1.使用python编写的py文件(也就意味着py文件也可以称之为模块:一个py文件也可以称之为一个模块)(***)
    2.已被编译为共享库或DLL的C或C++扩展(了解)
    3.把一系列模块组织到一起的文件夹(文件夹下有一个__init__.py文件,该文件夹称之为包)(***)
       包:一系列py文件的结合体
    4.使用C编写并连接到python解释器的内置模块

  为什么要使用模块:

    1.用别人的模块可以加快开发效率(内置/第三方)

    2.使用自定义模块,在一个项目中可能会多次使用,这样可以将其放在项目文件夹lib中,将其放在common.py文件中,当别的地方需要时可直接调用

ps:在调用文件的过程中一定要区分哪个是执行文件,哪个是被导入文件

  双下name方法:在执行文件中__name__=__main__,多用在执行文件中,对执行文件进行测试如:

if __name__ == '__main__':  # 快捷写法,在pycharm中输入main然后tab键index1()index2()

 

  如果文件是被当作模块导入的__name__输出为模块名(不加后缀)

 

二.模块导入的两种方式

2.1.导入两种方式:

1.import+模块名

    右键运行执行文件发生的事(run.py):

      1.首先会创建一个run.py的名称空间

      2.首次导入模块(mk.py)

      3.运行mk.py模块

      4.将mk.py在运行中产生的名字和值存放在mk.py的名称空间中

      5.在执行文件run.py中拿到一个指向mk.py名称空间的名字

 

    ps:1.首次导入模块会创建名称空间,但是之后再次导入该模块,该模块的名称空间已存在,不会创建新的名称空间了,会沿用第一次导入的结果

         2.当几个模块有相同的部分或者属于同一个模块时可以使用以下句式(不推荐)

mport+模块名1,模块名2,模块名3....

      当几个模块没有联系的情况下应该分多次导入     

import+模块名1
import+模块名2
...

 

      3.当模块的名字很长时,可以给模块取一个别名,如下:这样在在访问模块名称空间下的名字就可以写成kx.名字

import wohaokuaixina as kx

    使用import打入模块,访问模块下名称空间的名字同意句式:模块名.名字

      特点:1.指名道姓的访问模块中的名字,永远不会与执行文件中的名字冲突

         2.访问模块中的名字必须严格按照句式模块名.名字

2.from...import....

  右键运行执行文件发生的事(run.py):

      1.首先会创建一个run.py的名称空间

      2.首次导入模块(mk.py)

      3.运行mk.py模块

      4.将mk.py在运行中产生的名字和值存放在mk.py的名称空间中

      5.在执行文件run.py中拿到一个指向mk.py名称空间中某个值的名字

 

    ps:1.在使用from...import...句式访问模块中的名字不需要加模块名前缀,但是在访问模块中名字可能会产生冲突

       2.可以使用from 模块名 import *的句式将模块中的名字一次性全加载出来(不推荐)

       在这种方式里存在一个方法为__all__,在__all__=[],在列表中可以添加我们需要的名字,这样通过from 模块名 import *读到的名字就是咧白哦种的名字,这样可以限制导入者拿到的名字个数

三.解决文件循环导入的方法

3.1循环导入案例:  

  运行文件run.py

import mi
m1.f1()

  模块m1.py

print('正在导入m1')
from m2 import y  # 首次导入m2
x = 'm1'

  模块m2.py

print('正在导入m2')
from m1 import x  # 第二次导m1
y = 'm2'

  当运行run.py文件时,名称空间内入下图所示

3.2解决循环导入的方法一:将循环导入的语句写在最下方

#m1.py模块print('正在导入m1')
x = 'm1'
from m2 import y  #m2.py模块print('正在导入m2')
y = 'm2'
from m1 import x

  

3.3解决循环导入的方法二:函数内导入模块

#m1.py模块print('正在导入m1')
def f1():from m2 import y,f2print('m1.f1>>>y:',y)f2()
x = 'm1'#m2.py模块print('正在导入m2')
def f2():from m1 import xprint('m2.f2>>>x:',x)
y = 'm2'

ps:如果在程序中出现循环导入问题,应该想办法取消循环,这应该在程序设计阶段就要避免,实在不行再用此种方式取解决

四.模块的查找顺序

4.1查找顺序:

  1.内存

  2.内置

  3.sys.path(相当于环境变量)

ps:sys.path就相当于一个大列表列表中放了一大推文件路径,第一个文件路径就是执行文件所在的文件夹

五.模块的绝对导入,相对导入

  绝对导入:绝对导入必须根据执行文件所在的文件夹路径为准,绝对导入无论在执行文件还是被导入文件都可以使用

  相对导入:在相对导入中'.'代表当前路径,'..'代表上一级路径,'...'代表上上级路径.相对导入只能在被导入模块中使用,在使用相对导入时不需要考虑执行文件是谁,只需要考虑模块间的路径关系

六.软件目录目录规范

  项目根目录:

    1.启动文件夹(bin)--------------start.py文件

ps:启动文件也可以直接放在项目根目录下

    2.配置文件夹(conf)[不经常改变的变量,IP,PORT,DATABASE]--------------setting.py文件

    3.公共功能文件(lib)[其他文件可能要用到的功能]--------------common.py文件

     4.核心逻辑文件夹(core)--------------src.py文件

     5.日志文件夹(log)--------------log.log日志文件

    6.数据库文件夹(db)

    7.readme文本文件(对软件的介绍)

 

 

 

转载于:https://www.cnblogs.com/z929chongzi/p/11197347.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/350007.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

java dll 乱码_java调用c++ dll出现中文乱码 | 学步园

最近的开发用到了使用java调用本机动态连接库的功能,将文件路径通过java调用C代码对文件进行操作。在调用中如果路径中包含有中文字符就会出现问题,程序运行就会中止。下面用一个小例子,来说明记录下解决的方法。java中传入一个字符串&#x…

每日一问:Android 滑动冲突,你们都是怎样处理的

坚持原创日更,短平快的 Android 进阶系列,敬请直接在微信公众号搜索:nanchen,直接关注并设为星标,精彩不容错过。 在 Android 开发中,滑动冲突总是我们一个无法避免的话题。而对于解决方案却是众说纷纭。比…

java多线程 cpu分配_java多线程总结(转载)

Java 多线程编程总结-------------------------------------------------------------------------------------------------下面的内容是很早之前写的,内容不够充实,而且是基于Java1.4的内容,Java5之后,线程并发部分扩展了相当多…

java设计模式迭代器模式_迭代器模式和Java

java设计模式迭代器模式大家好,在本文中,我们将检查Iterator Pattern 。 我知道你们中许多人已经使用过一种设计模式,但是也许您没有意识到它是模式,或者不知道它的巨大价值。 根据《 Head First Design 》一书: 迭代…

笔记_SQLite入门

1、SQLite是什么? QLite没有单独的服务器进程。 它直接读取和写入普通磁盘文件。 具有多个表,索引,触发器和视图的完整SQL数据库包含在单个磁盘文件中。2、SQLite语法 区分大小写: SQLite不区分大小写。但是,有一些区分…

java线程提交_从Java线程到线程池

线程模型线程模型分为两类,用户级线程(ULT)和内核级线程(KLT)用户级线程(ULT):user level threads,系统内核对ULT无感知,线程的创建和调度都由用户级APP进程管理;即APP自行管理的线程,就是用户级线程内核级…

使用Spring Boot自动发布和监视API

如果您正在沿着微服务风格的架构前进,那么您将需要接受的一个租户就是自动化。 这种架构风格介绍了许多活动部件。 如果成功,您的环境将具有大量服务API,企业可以将其用于应用程序开发和集成。 这意味着必须有一种方法可以发现可用的API文档…

mysql导入导出

导出1.将数据库mydb导出到e:\mysql\mydb.sql文件中:打开开始->运行->输入cmd 进入命令行模式c:\>mysqldump -h localhost -u root -p mydb >e:\mysql\mydb.sql然后输入密码,等待一会导出就成功了,可以到目标文件中检查是否成功。…

mysql 半同步关闭_MySQL的半同步模式配置

1、什么是半同步?在有一台主服务器、多台从服务器的情况下,主服务器只会等待一台从服务器同步数据。2、为什么要使用半同步?在使用同步模式时,数据的写速度太慢。在使用异步模式时,可能会造成从服务器上的现在存储的数…

GIS集成技术之二:数据集成

一。数据驱动。疑惑:ado.net作为一种通用的数据技术,适用与各种格式的文件各种格式的数据库,为一种通用的编程模型。GIS也提出数据集成:毫无疑问,不陷于某击中数据库。因此,我觉得GIS的中心是数据驱动&…

mysql中的replication_mysql中replication的相关问题总结

首先,要使用mysql中的replication,则需要配置master的my.cnf。例如:复制代码 代码示例:server-id 1log_bin mysql-bin#log_bin /var/log/mysql/mysql-bin.logexpire_logs_days 10max_binlog_size 100M#binlog_do_db include_database_na…

rest spring_带有Spring的REST的ETag

rest spring1.概述 本文将重点介绍ETag – Spring支持,RESTful API的集成测试以及带有curl的使用场景。 这是关于使用Spring 3.1和Spring Security 3.1和基于Java的配置来建立安全的RESTful Web服务的系列文章的第9篇。 REST with Spring系列: 第1部分 …

MySQL最早版本源码_MySQL旧版本升级为新版本

一:从版本3.23升级到4.104.10新特性:支持事务处理和存储过程升级过程的注意事项:1:升级采用直接复制安装文件的方法,简单实用,但要注意相关的配置更改; 2:直接复制备份的数据库不能通过复制的方法恢复&…

关于国产科学软件的思考(转)

转自 http://blog.pfan.cn/eMath/24264.html 作者 爱数学 http://blog.pfan.cn/eMath 原文如下: 这一段一直在问自己这个问题:“在我们常用的科学计算软件当中,有多少国产的?”,在记忆里面搜索了很久,似乎…

每个私有静态方法都是新类的候选人

您是否有私有的静态方法来帮助您将算法分解为更小的部分? 我做。 每次编写新方法时,我都会意识到它可以是一个新类。 当然,我不会从所有课程中选修课程,但这是目标。 私有静态方法不可重用,而类则可重用,这…

448. Find All Numbers Disappeared in an Array

一、题目 1、审题  2、分析 一个整形数组!元素值为 1~size; 出现的元素次数为 1~2 次。 求出所有 1~size 中没有出现的整数! 二、解答 1、思路 由于元素值都为 1~size之间。所以可以将数组下标 index 进行联系。 ① 遍历数组,将出现的元素值…

枚举:如何正确使用name()和toString()方法

两种方法之间的区别? Java枚举有两种方法来检索枚举常量的值: name()和.toString() 。 toString()方法调用name()方法,该方法返回枚举常量的字符串…

gradle maven_Gradle – Maven的观点

gradle maven正如我博客的读者所知道的, 我有点像Maven迷 。 我从2007年8月左右开始使用Maven,从没有回过头。 但是,与其他所有情况一样,“变化是唯一的常数”。 现在这个领域还有其他参与者,Gradle似乎是最有前途的。…

JDK 9中已弃用Java的Observer和Observable

在博客文章《 应用JDK 9 Deprecated增强功能》中 ,我讨论了JDK 9中 Deprecated批注中对forRemoval()和since()可选元素(方法)的添加 。 我在那篇文章中说:“在Java SE API上应用新的…

理解依赖注入(IOC)和学习Unity

IOC:英文全称:Inversion of Control,中文名称:控制反转,它还有个名字叫依赖注入(Dependency Injection)。 作用:将各层的对象以松耦合的方式组织在一起,解耦,各层对象的调…