• 模块


    模块

    模块的搜索顺序: 内存--内置--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
     
     

  • 相关阅读:
    数与bit
    ARM汇编优化1
    一 *(a+1)与*(&a+1)
    二 *(a+1)多维数组
    三 二维数组取址
    四 sizeof(a)
    永恒之蓝及WannaCry分析
    github使用记录
    三种页面置换算法的C++模拟
    opencv检测图像直线
  • 原文地址:https://www.cnblogs.com/Gavinkwok/p/6937015.html
Copyright © 2020-2023  润新知