模块

模块

模块的搜索顺序: 内存--内置--sys.path(环境变量)
导入模块要做的3件事
1.创建新的作用域
2.在该作用域中执行顶级代码
3.得到一个模块名,绑定到该模块内的代码
 
#模块更新不会影响到已经使用的文件,因为文件之前已经把该模块写入到内存,
#模块导入一次就导入到内存,多次导入只是从内存中读取
 
2中调用模块的方式
  1. 定义模块 python文件名是spam
    1. __all__=["money","read1"] #本模块中能这调用money和read1,只针对from ... ipmprt * 形式,
    2. aa=("form modue spam")
    3. money=100
    4. money1=10000
    5. def read1():
    6. print(money)
    7. def read2():
    8. print(money1)
    9. if __name__=="__main__": 
    10. #如果条件成立,可继续写条件操作,主要用于测试环境测试该脚本    
    11. #__name__是本文件的名字 __main__是以脚本形式调用的该文件
    12. #如果__name__的值不是__main__,说明该文件是被当做模块调用的形式使用
    13. print("该文件被当做脚本文件执行"
    14.  

  2. 从新建立个python,作用:调用上边的模块
  1. import
    1. #直接调用模块
    2. import spam #调用模块
    3. import spam as sm #定义spam别名为sm
    4. print(spam.aa) #显示模块中的aa变量
    5. #form modue spam
    6. print(sm.aa) #显示模块中的aa变量
    7. #form modue spam
    8. spam.read1() #调用模块中的函数
    9. #100
  1. from ... import ...
    1. #调用指定模块的变量或函数,调用时不用指定模块名
    2. from spam import read1,aa        #调用spam模块的read1函数和aa变量
    3. #from spaa import read1         #注意不同模块的同名函,下边模块中函数会覆盖上边模块中函数
    4. from spam import read1 as read   #创建别名,如此调用spam的read1就使用read就和spaa不冲突了
    5. read1()
    6. #100
    7. print(aa)
    8. #form modue spam
    9. #注意,如果在本文件中定义函数read1 会显示本文件中的函数,而不是模块中的read1
    10. def read1():
      aa=("aa11")
      return aa
      print(read1())
    11. #aa11
  1. from ... ipmprt *            
    1. #调用sapm模块总不以_开头的名字,全部可调用
    2. #建议不用,因为不知道模块中的值是否会和本文件冲突,
    3. #如果要用看模块调用的__all__ 可以错开这个问题(看上边的定义模块)
    4. read1()
    5. #100
    6. print(money)
    7. #100
    8. print(money) #会报错 因为在模块中定义了__all__
     
  1.  
 

包针对模块导入的功能
包(目录)是一种通过使用模块名来组织python模块名称空间的方式
 
模块导入的时候,只要是遇到"."的都是包导入,注"."的左边边必须是一个包(目录)
 

__init__

作用:初始化包的代码,
  1. #只要导入包,就会依次执行包下的__init__py文件,再执行包下的py文件或包下的子包
  2. #__init__.py默认创建, __init__.py可以为空,也可以存放初始化包的代码
  3.  
  4. #__init__同级有cc.py
  5.  
  6. __all__=["cc","money","read1"] #可以使用cc.py,money变量,dd函数,只针对from ... ipmprt * 形式,
  7. print("==hello==")
  8. x=1
  9. money=100
  10. money1=1000
  11. def dd():
  12. print(money)
 
  1. #调用同级目录的其他目录N级下的文件
  2. aa.db.cc是3层包,每层目录下默认有__init__.py文件
 

import导入

  1. 要用途导入内置模块
  2. import aa.db.cc #.的左边必须是包 aa和db是包 cc是py文件
  3. aa.db.cc.dd() #dd是函数
  4. # import aa.db.cc as e #cc创建别名为e
  5. # e.dd() #再次调用e.py,不用写路径
 

from..import...模式导入

  1. #主要用于导入自己创建子包,
  2. #针对form后import导入模块,必须不能带.(点),否则会语法错误
  3. #例如from aa.db import cc.dd (dd文件和dd函数同时在import后边就会报错)
  4. #这是绝对路径导入(cc.py文件可以调用db包下其他py文件,import模式就需要加入path路径)
  5. from aa.db.cc import dd #dd是cc.py下的函数
  6. dd()
  7. #这是相对导入(..是上层目录,就是调用上层目录下的db包的cc.py文件)
  8. from ..db.cc import dd
  9. dd()
  10.  
  11. #单独导入    不太懂
  12. from .db import cc    #当前目录导入, 和db在同级目录,调用cc.py
  13.  
 

from aa.db import *    

#只是执行每个包下的__init__文件中的内容
  1. #如下可以执行cc.py和dd下的n个py文件
  2. from aa.db import *    #dd包中定义了__all__
  3. read1()
  4. #100
  5. print(money)
  6. #100
  7. print(money) #会报错 因为在dd中__aa__没有money1
 
 

原文地址:https://www.cnblogs.com/Gavinkwok/p/6937015.html