模块的表现形式、使用时内部发生的细节、循环导入问题、__name__的用法等

模块:

就是一系列功能的结合体

模块的三种来源:

1.内置的(python解释器自带的)

2、第三方的(别人写的)

3、自定义的(自己手写的)

模块的四种表现形式:

1.自己用Python编写的py文件也可以成为是一个模块

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

为什么使用模块:

1、使用别人写好的模板(内置或者第三方的)可以极大的提高开发效率,而且自己写的话不一定功能那么全面。

2、自定义的模板:当你在遇到一个规模较大的项目时,内部可能会有很多重复的方法,这是就需要分开写在不同的py文件中,再将一些公共的方法在一个py文件中,其他py文件想要使用这些方法时可以直接以模块的形式直接调用。

如何使用模块:

(****重点****)要正确区分哪个是执行文件哪个是被导入文件。

右键运行run.py文件首先会创建一个run.py的名称空间
首次导入模块(md1.py)(******)
1.执行md.py文件
2.运行md.py文件中的代码将产生的名字与值存放到md.py名称空间中
3.在执行文件中产生一个指向名称空间的名字(md)
多次导入不会再执行模块文件,会沿用第一次导入的成果(******)

 在使用import导入模块时,访问模块中名称空间中的变量时,为模块名.变量名,永远不会和执行文件中相同的变量名发生冲突,想访问模块中的名字是必须使用模块名.名字的方式。

重点:

1.函数是第一类对象,只要通过变量名得到这个函数的内存地址,就可以通过变量名加括号的形式来调用这个函数

2.函数在定义阶段,它内部变量取值的查找顺序就已经固定死了,不会因为调用位置的改变而改变。

当几个模块之间有联系或者具有相似部分时导入时可以写在一行,否则需要分多次导入。

当模块名字较长较复杂是可以为其取个别名:import    模块名    as     别名

异常通常有两类:

1、语法结构错误:需要当场修改,异常处理try:....except:....检测不到

2、逻辑结构错误:异常捕获可以处理

使用from    模块名   import    变量名    时过程与使用import时相似

但是可以直接拿到被调用模块中的某个变量名

使用这种方式的缺点:

1.访问模块中的名字不需要加模块名的前缀

2.容易与执行文件中相同的变量名产生冲突

from    md1   import   *可以调用md1中全部的名字,但是不太推荐使用,因为不清楚有哪些可以用,造成内存的过量占用。

__all__可以用来限制调用模块时可以得到的名字

__all__ = ['money','read1','read2']#在别的模块中调用时只能得到列表中的这些名字。

循环导入问题的解决方案:

循环导入问题:

当右键运行run.py文件时,先创建一个run.py的名称空间,第一次导入m1时,先创建m1的名称空间,打印正在导入m1,之后又去导入m2,m2也是第一次被导入,所以先创建一个m2的名称空间,之后m1中创建m2指向m2的名称空间,之后m2中第二次导m1,但是这时需要导入的x并没有被创建所以会出现报错现象,这就是循环导入问题。

循环导入问题一定是你的程序设计的不合理,我们应到在程序设计阶段就避免。

 解决方案:

方式1:

将循环导入的句子写在文件的最下方

方式2:

函数内导入模块(如上图)

__name__:可以用来区分文件时执行文件还是被当做模块调用,防止了被当做模块调用时,文件还要被运行一遍的尴尬局面。

具体用法:

def index2():
print('index2')
# print(__name__)
# 当文件被当做执行文件执行的时候__name__打印的结果是__main__
# 当文件被当做模块导入的时候__name__打印的结果是模块名(没有后缀)
# if __name__ == '__main__':
# index1()
# index2()

快捷写法:main之后直接按tab键即可。

模块的查找顺序:

1、先从内存中找

2、从内置中找

3、从sys.path中找(环境变量):

****重点*****:需要正确区分谁是执行文件,谁是被导入文件。(因为查找过程中是以执行文件为基准去找的)

是一个放着一堆文件路径的大列表,但第一个文件路径永远是执行文件的所在文件夹。

import time
import md
time.sleep(20)
md.f1()

用来验证是否先从内存中取,需要在time.sleep(20)时,将md.f1()删掉,证明已经事先将模块加载到内存中了。

还需要注意自定义模块名(文件名)不应该与内置的(和第三方的)模块名冲突

import sys 

sys.path.append(r'D:\Python项目\day14\dir1')    #将这个文件夹添加到环境变量中

print(sys.path)

绝对导入:需要依据执行文件所在的文件夹路径为准

在执行文件中和被导入文件中都适用

from dir1.dir import m1

m1.f1()

相对导入:

.表示当前路径

..表示上一级路径

...代表上上一级路径

注意:

1、相对导入不能在执行文件中用

2、相对导入不用考虑执行文件是哪个,只需要关心当前模块与被导入文件之间的路径关系。

软件开发目录规范:

1、项目启动文件通常放在两个地方

         1、bin文件夹下

 start.py

         2、直接放在根目录

2、conf:配置文件

settings.py

3、lib:公共的方法

common.py

4、core:核心逻辑代码

src.py

5、log:日志

talk_log.py

6、db:数据库相关的操作

userinfo.txt

7、readme:对软件的介绍

将ATM的文件夹放到环境变量中,可以兼容所有用户  

__file__:当前的文件所在位置

启动文件的固定格式:

import   sys 

import    os

BASE_DIR = os.path.dirname(os.path.dirname(__file__))#dirname返回上一级

 sys.path.append(BASE_DIR)

from   core    import   stc

if   __name__=='__main__'

src.run()

原文地址:https://www.cnblogs.com/yangjiaoshou/p/11197199.html