一、模块导入
对于一个真实的pyhton程序,我们不可能自己完成所有的工作,通常都需要借助于第三方类库。此外,也不可能在一个源文件中编写整个程序的源代码,这些都需要以模块化的方式来组织项目的源代码。
导入模块需要用到import语法。import有两个主要的用法:
1.import 模块名 导入整个模块
2.form 模块名 import 成员名
二、 模块导入方式一:import 模块名
import md
在一个py文件下运行程序的步骤:
1首先会创建一个该py文件的名称空间
2运行模块(md.py文件)中的代码,并将成圣的名字和值存放在内存空间中
注意:不要多次导入相同模块
1.2访问模块名称空间中名字方法:模块名.名字
import md md.read1() md.read2() md.change()
下面是md.py文件中的代码
money = 1000 def read1(): print('md',money) def read2(): print('md模块') read1() def change(): global money money = 0
这样避免与执行py文件中的名字冲突。
1.3多个模块的导入
应该转行写。并且写在执行文件的开头
import os import time import md
1.4当模块名比较复杂,可以给模块名取别名
为已经导入的模块起别名的方式对编写可扩展的代码很有用
1 import spam as sm 2 print(sm.money)
1.5在一行导入多个模块
1 import sys,os,re
三、模块导入方式二:from 模块名 import 成员名
这个方法是导入的模块中的具体某个功能
记住:
这个方法import后面是模块中的成员名;
而import 模块名方法,则import后面跟的模块名。
执行文件的代码:
from md import money
money = '我是执行文件中的money
print(money)
下面是md.py文件中的代码
money = 1000
运行结果是:我是执行文件中的money。如果模块导入放在money下面结果就不一样了。原因用到from 模块名 import 具体内容的流程
会先创建执行文件的名称空间 首次导入md.py模块 1.运行md.py 2.将产生的名字存放到md.py名称空间中 3.直接拿到指向模块md.py名称空间中某个值的名字
总结:from 模块名 import 成员名句式的缺点
1.访问模块中的名字不需要加模块名前缀
(因为这样,极易与执行文件的名字重复,导致打印结果不对。)
2.在访问模块中的名字可能会与当前执行文件中的名字冲突
补充:
一、from 模块名(文件名) import 具体功能(需要调用的具体功能)
假如需要使用导入模块中的多个具体功能。可以用*号代替
from md1 import *
但是这引起了一个缺点:占内存(一次性将所有名字放入内存)和不知道哪些名字能够使用(没有重复)
二、__all__
在这个模块调用模式下,写在被调用模块的代码中限制被执行文件获取的名字
__all__ = ['money','read1','read2']
现在只有这些名字可以被执行文件引用
四、循环导入
如果出现循环导入问题 那么一定是你的程序设计的不合理
循环导入问题应该在程序设计阶段就应该避免
执行文件代码:
from dir1.dir import m1 m1.f1()
m1的代码
print('正在导入m1') def f1(): from dir1.dir.m2 import y,f2 print('m1.f1>>>y:',y) f2() x = 'm1'
m2的代码
print('正在导入m2') def f2(): from dir1.dir.m1 import x print('m2.f2>>>x:',x) y = 'm2'
解决循环导入问题的方式
1.方式1
将循环导入的句式写在文件最下方()
2.方式2
函数内导入模块
1.方式1
将循环导入的句式写在文件最下方()
2.方式2
函数内导入模块
五、_name_的使用
当一个文件被当做模块调用时,不希望一调用就出来打印结果,那么可以在被调用的文件中加入:
if __name__=='__main__': 函数1() 函数2()
因为文件被调用有一个特点,被当做执行文件时,__name__打印结果是__main__
当被当做模块导入时,结果为模块名
关于上面的代码还有一个简写形式:
输入main直接tab键
五、模块的查找顺序:
1、模块的查找顺序:
①、先从内存中找
②、再从内置中找
③、最后在sys.path中找(可以理解为环境变量),sys.path是一个大列表,里面放了一堆文件路径,第一个路径永远是执行文件所在的文件夹
2、注意点:一定分清楚谁是执行文件谁是被导入文件(******),py文件名不应该与模块名(内置的,第三方的)冲突
3、将文件路径添加到sys.path中
import sys sys.path.append(r'D:Python项目dir1') from dir1.dir import md # 当需要导入的模块不在执行文件的目录下时,可以利用这种方式找到模块文件 # 缺点:添加的路径太过绝对,用户自定义安装后会导致该路径失效,软件崩溃。
六、绝对导入和相对导入
绝对导入必须依据执行文件所在的文件夹路径为准
1绝对导入无论在执行文件中还是被导入文件都适用
相对导入
.代表的当前路径
..代表的上一级路径
...代表的是上上一级路径
注意相对导入不能再执行文件中使用
相对导入只能在被导入的模块中使用,使用相对导入 就不需要考虑
执行文件到底是谁 只需要知道模块与模块之间路径关系
from dir1.dir import m1
意思为:调用dir1下的dir文件夹中的m1文件
七、软件开发目录规范
项目名 bin start.py(项目启动文件) conf settings.py(项目配置文件) core src.py(项目核心逻辑) db 数据库相关文件 lib common.py(项目所用到的公共的功能) log log.log(项目的日志文件) readme.txt(项目简介) 1、strat.py 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 import os import sys BASE_DIR = os.path.dirname(os.path.dirname(__file__)) sys.path.append(BASE_DIR) """ pycharm会自动将你新建的最顶层的目录添加到sys.path中 上面这两句话,不是针对你的,是针对下载你这个软件的用户 """ from core import src if __name__ == "__main__": src.run() # 当start.py文件主动执行时才会调用src.run()函数 # 1.将core文件路径添加到system path中 (...太low) # 2.将项目文件夹添加到system path中 注意:不要手动拼接路径,跨系统时可能会出错