模块
模块的搜索顺序: 内存--内置--sys.path(环境变量)
导入模块要做的3件事
1.创建新的作用域
2.在该作用域中执行顶级代码
3.得到一个模块名,绑定到该模块内的代码
#模块更新不会影响到已经使用的文件,因为文件之前已经把该模块写入到内存,
#模块导入一次就导入到内存,多次导入只是从内存中读取
2中调用模块的方式
-
定义模块 python文件名是spam
- __all__=["money","read1"] #本模块中能这调用money和read1,只针对from ... ipmprt * 形式,
aa=("form modue spam")
money=100
money1=10000
def read1():
print(money)
def read2():
print(money1)
- if __name__=="__main__":
- #如果条件成立,可继续写条件操作,主要用于测试环境测试该脚本
- #__name__是本文件的名字 __main__是以脚本形式调用的该文件
- #如果__name__的值不是__main__,说明该文件是被当做模块调用的形式使用
- print("该文件被当做脚本文件执行"
-
- 从新建立个python,作用:调用上边的模块
- import
#
直接调用模块import spam #调用模块
import spam as sm #定义spam别名为sm
print(spam.aa) #显示模块中的aa变量
#form modue spam
print(sm.aa) #显示模块中的aa变量
#form modue spam
spam.read1() #调用模块中的函数
#100
- from ... import ...
- #调用指定模块的变量或函数,调用时不用指定模块名
from spam import read1,aa #调用spam模块的read1函数和
aa变量#from spaa import read1 #注意不同模块的同名函,下边模块中函数会覆盖上边模块中函数
from spam import read1 as read #创建别名,如此调用spam的read1就使用read就和spaa不冲突了
read1()
#100
- print(aa)
#form modue spam
- #注意,如果在本文件中定义函数read1 会显示本文件中的函数,而不是模块中的read1
-
def read1():
aa=("aa11")
return aa
print(read1()) -
#aa11
from ... ipmprt *
-
#调用sapm模块总不以_开头的名字,全部可调用
#建议不用,因为不知道模块中的值是否会和本文件冲突,
#如果要用看模块调用的__all__ 可以错开这个问题(看上边的定义模块)
read1()
#100
print(money)
#100
print(money) #会报错 因为在模块中定义了__all__
包
包针对模块导入的功能
包(目录)是一种通过使用模块名来组织python模块名称空间的方式
模块导入的时候,只要是遇到"."的都是包导入,注"."的左边边必须是一个包(目录)
__init__
作用:初始化包的代码,
#只要导入包,就会依次执行包下的__init__py文件,再执行包下的py文件或包下的子包
#__init__.py默认创建, __init__.py可以为空,也可以存放初始化包的代码
#__init__同级有cc.py
__all__=["cc","money","read1"] #可以使用cc.py,money变量,dd函数,只针对from ... ipmprt * 形式,
print("==hello==")
x=1
money=100
money1=1000
def dd():
print(money)
#调用同级目录的其他目录N级下的文件
- aa.db.cc是3层包,每层目录下默认有__init__.py文件
import导入
要用途导入内置模块
import aa.db.cc #.的左边必须是包 aa和db是包 cc是py文件
aa.db.cc.dd() #dd是函数
# import aa.db.cc as e #cc创建别名为e
# e.dd() #再次调用e.py,不用写路径
from..import...模式导入
- #主要用于导入自己创建子包,
#针对form后import导入模块,必须不能带.(点),否则会语法错误
#例如from aa.db import cc.dd (dd文件和dd函数同时在import后边就会报错)
#这是绝对路径导入(cc.py文件可以调用db包下其他py文件,import模式就需要加入path路径)
from aa.db.cc import dd #dd是cc.py下的函数
dd()
#
这是相对导入(..是上层目录,就是调用上层目录下的db包的cc.py文件)- from ..db.cc import dd
dd()
- #单独导入 不太懂
- from .db import cc #当前目录导入, 和db在同级目录,调用cc.py
from aa.db import *
#只是执行每个包下的__init__文件中的内容
#如下可以执行cc.py和dd下的n个py文件
from aa.db import * #dd包中定义了
__all__read1()
#100
print(money)
#100
print(money) #会报错 因为在dd中__aa__没有money1