内容概要
- 互相导入模块
- 一个python文件有几种用途
- 模块功能
- 模块搜索路径的优先级
内容详细
-
互相导入模块
m1.py
# print('正在导入m1') # x = 'm1' # from m2 import y # 三件事,造一个m2的名称空间 # 开始运行m2 # 产生y这个名字去指向m2中的y的内存地址 # x = 'm1' # 方式二: import sys print('正在导入m1') def f1(): from m2 import y print(y) x = 'm1'
m2.py
# 方式一: # print('正在导入m2') # y = 'm2' # from m1 import x # # 三件事,造一个m1的名称空间 # # 开始运行m1 # # 产生x这个名字去指向m1中的x的内存地址 # # y = 'm2' # 将这里的y='m2'往上提到from m1 import x之上才有用,不然再这个位置报错 # 方式二: print('正在导入m2') def f2(): from m1 import x print(x) y = 'm2'
run.py
import m1 # 第二种方式 m1.f1() # 运行结果: # 正在导入m1 # 正在导入m2 # m2
-
一个python文件有几种用途
# 一个python文件有两种用途 # 1.被当作程序运行 # 2.被当作模块导入
-
模块功能
''' 一、模块的介绍 模块就是一系列功能的集合体,分为三大类 1.内置的模块 2.第三方的模块 3.自定义的模块 一个python文件本身就是一个模块,文件名 m.py ,模块名 m ps:模块分为四种模式 1.使用python编写的.py文件 2.把一系列模块组织到一起的文件夹(注:文件夹下有一个_init_.py文件,该文件夹称之为包) 3.已编译为共享库或DLL的C或C++扩展 4.使用C编写并链接到python解释器的内置模块 二、为何要用模块 1.内置与第三方的模块拿来就用,无需定义,这种拿来主义,可以极大的提升自己的开发效率 2.自定义的模块 可以将程序的部分功能提取出来放到一个模块中为大家共享使用 好处是介绍了代码冗余,程序组织结构更加清晰 三、如何用模块 ''' ''' foo.py文件的内容: x=1 def get(): print(x) def change(): global x x=0 ''' # 一、如何用模块 # import ... # 1.首次模块导入会做三件事: # 1、执行源文件代码 # 2、产生一个新的名称空间用于存放源文件执行过程中产生的名字 # 3、在当前执行文件所在的名称空间中得到一个名字foo,该名字指向新创建的模块名称空间, # 若要引用模块名称空间中的名字,需要加上该前缀 # 需要强调一点是,第一次导入模块已经将其加载到内存空间了,之后的重复导入会直接引用内存中已存在的模块, # 不会重复执行文件,通过import sys,打印sys.modules的值可以看到内存中已经加载的模块名。 # import sys # print(sys.modules) # # 'foo': <module 'foo' from 'D:\\Users\\ycc\\PycharmProjects\\pythonProject\\day 13\\foo.py'>} # 2.引用 # 强调一: # 加上foo.作为前缀就相当于指名道姓地说明要引用foo名称空间中的名字, # 所以肯定不会与当前执行文件所在名称空间中的名字相冲突,并且若当前执行文件的名称空间中存在x, # 执行foo.get()或foo.change() # 强调二:无论是查看还是修改都是以原模块为基准的,与调用位置无关 # 例: # x = 100 # import foo # foo.x # 这里虽然定义了变量x,但是foo.x 输出结果仍为 1 # foo.get() # foo.change() # 二:导入模块的模式与规范 # 模式 # 1.可以improt语句导入多个模块(推荐使用) # import a # import b # ... # 2.在一行导入,用逗号分隔开不同的模块(不推荐) # import a,b,c,... # 规范(按以下顺序导入模块,虽然不按顺序也不会报错,但是算是自发的规定) # 1.内置模块 # 2.第三方模块 # 3.自定义模块 # 其他导入语法 # import foo as f # 注:这里as f后不要加冒号 # # 这里相当于把foo换个名字,因为可能会遇到名字特别长的模块名,为了调用时方便,可这样操作 # f.x # 等价与foo.x # f.get() # f.change() # 模块是第一类对象 # 自定义模块的命名应该采用纯小写+下划线的风格(python3中) # python2中是驼峰体的风格 # from 模块 import 模块内的功能 from foo import x,get,change #将模块foo中的x和get导入到当前名称空间 a=x #直接使用模块foo中的x赋值给a get() #直接执行foo中的get函数 change() #即便是当前有重名的x,修改的仍然是源文件中的x ''' 无需加前缀的好处是使得我们的代码更加简洁, 坏处则是容易与当前名称空间中的名字冲突, 如果当前名称空间存在相同的名字,则后定义的名字会覆盖之前定义的名字。 '''
-
模块搜索路径的优先级
# 无论是import还是from...import...在导入模块时都涉及到查找问题 # 优先级: # 1.内存(内置空间) # 2.硬盘:按照sys.path中存放的文件的顺序依次查找要导入的模块 import sys print(sys.path) # 值为一个列表,存放了一系列的文件夹 # 其中第一个文件夹是当前执行文件所在的文件夹 # import foo # 内存中已经有foo了 # foo.say() # # import time # 在这10秒时间内,将foo.py删掉 # time.sleep(10) # # import foo # 10秒后,仍能调用,说明是从内存中找的 # foo.say()