zoukankan      html  css  js  c++  java
  • 模块

    研究模块一定要清楚谁是执行文件,谁是被导入模块,sys.path是以执行文件为准的
    (导入模块间相互调用,也是参考执行文件的sys,path)
    模块
    一. 什么是模块
    模块就是一系列功能的集合体

    模块分为四个通用的类别:
      1 使用python编写的.py文件(*****)

      2 已被编译为共享库或DLL的C或C++扩展

      3 包(*****)

      4 使用C编写并链接到python解释器的内置模块

    模块有三种来源:
    1. 内置模块
    2. 第三方模块
    3. 自定义模块

    二. 为何要用模块
    1. 使用内置的或者第三方的模块的好处是:拿来主义,极大提升开发效率
    2. 使用自定义的模块的好处是:将共用功能代码放入模块中,好处是可以减少代码冗余
    三. 如何用模块
    1.命名:与变量命名方式相同(注意不能把常用模块名命名成模块名)
    2.首次导入模块会发生三件事
      1. 会产生一个 '导入模块' 的名称空间
      2. 执行 '导入模块’ 中文件的内容,将产生的名字丢到‘导入模块’的名称空间里
      3. 执行时,在当前 ‘执行文件’ 中拿到一个名字(模块名),该名字指向 ‘导入模块’ 名称空间  (import导入)
      3. 在当前执行文件中拿到名字read1,该名字指向模块的名称空间中的read1  (from spam import read1)

    3.查找模块路径的优先级
      1. 内存
      2. 内置模块
      3. sys.path(是以执行文件为准的,执行文件所在的文件夹)

    4. 补充:
       import spam as sm      模块较长时,可以使用as赋值其他名字
      print(sm.money)

      可以在一行导入多个模块,建议一行导入一个
      import os,sys,spam

      区分python文件的两种用途
      if __name__ == __main__
    
    
    5.import总结
      优点:指名道姓地问某一个名称空间要名字,不会与当前执行文件名称空间中的名字冲突
      缺点:引用模块中的名字必须加前缀(模块名.),使用不够简洁

    6.from...import总结
      优点:引用模块中的名字不用加前缀(模块名.),使用更为简洁
      缺点:容易与当前执行文件名称空间中的名字冲突
    #导入模块spam,
    age = 18
    
    #执行模块run
    age = 20
    from spam import age
    print(age)
    
    >>>>18
    ___________________________________________________
    from spam import age
    age = 20 
    print(age)
    >>>>20
    View Code

     小练习,在引用模块里,分别改变函数了的可变/不可变的数据,改变前后执行模块里的值是否改变

    不可变

    引用模块spam
    age = 18
    def func():
        global age
        age = 20
    
    def func1():                    func1测试spam中age是否改变
        print(age)
    
    执行模块run
    from spam import age,func,func1
    print(age)
    func()
    print(age)
    
    func1()
    
    >>>>18
    >>>>18
    >>>>20
    View Code

    可变

    引入模块spam
    l=[]
    def func():
       l.append(1231)
    
    def func1():
        print(l)
    
    执行模块run
    from spam import l,func,func1
    print(l)
    func()
    print(l)
    
    func1()
    
    >>>>[]
    >>>>[1231]
    >>>>[1231]
    View Code

    *与__all__



    软件开发目录规范
      1.应该把项目的根目录加到环境变量里
      2.应该把项目根目录所在的绝对路径拿到,然后添加到环境变量里
      
    import os
    print(os.path.abspath(__file__))
    当前执行路径
    —————————————————————————————
    import os
    print(os.path.dirname(os.path.abspath(__file__)))
    当前路径上一级路径
    os.path.dirname      找当前路径上一级路径
    
    _____________________________________________________
    
    把环境变量写活,避免安装路径不同
    import os
    BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
    import sys
    sys.path.append(BASE_DIR)
    
    from core import scr
    scr.run()
    路径>>环境变量
    
    
        bin(启动文件)


        conf(配置文件)


        core(核心业务逻辑)
          src.py
          
        db(数据)


        lib(自定义模块)



        log(日志)


        readme文本文件
















    一、什么是包
        包就是包含有__init__.py文件的文件夹、
      注意:在py2中必须有一个__init__.py文件,而py3中即便没有也不会报错

    二、

    首次导入包,发送三件事,
    1. 以包下的__init_.py文件为基准来产生一个名称空间
    2. 执行包下的__init_.py文件的代码,将执行过程中产生的名字都丢到名称空间中
    3. 在当前执行文件中拿到一个名字p1,该p1就是指向__init__.py名称空间的


    总结包的使用无非注意三点:
    1. 但凡是在导入语句中带点的,点的左边都必须是一个包
    2. 导入包就是在导包下的__init__.py文件
    3. 如果使用绝对导入,绝对导入的起始位置都是以包的顶级目录为起始点
    4. 但是包内部模块的导入通常应该使用相对导入,用.代表当前所在的文件(而非执行文件),..代表上一级
    强调:
    1. 相对导入只能包内部的模块之间互相导入使用
    2. ..上一级不能超出顶级包





  • 相关阅读:
    STM32 Timer : Base Timer, Input Capture, PWM, Output Compare
    Bus Blaster v4 design overview
    JTAG Communications model
    ARM JTAG 信号 RTCK 应该如何处理?
    HappyJTAG2
    用SWD调试接口测量代码运行时间 ( SWO )
    ARM Cortex Design Considerations for Debug
    Technical Information ARM-related JTAG / SWD / SWV / ETM Target Interfaces
    Keil debugging techniques and alternative printf (SWO function)
    Serial Wire Viewer (SWV)
  • 原文地址:https://www.cnblogs.com/pdun/p/10288811.html
Copyright © 2011-2022 走看看