zoukankan      html  css  js  c++  java
  • import模块/包--软件开发规范

    一. 模块

      模块:就是一个包含了python定义和声明的文件,文件名就是模块名字加上.py的后缀。

      import加载的模块分为四个通用类别: 

        1 使用python编写的代码(.py文件)

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

        3 包好一组模块的包

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

      import 语法:

        导入一个模块相当于执行了这个被导入的文件
        一个模块可以多次导入但不会被多次执行

        导入一个模块的时候命名空间的变化
          第一:创建了一块属于这个模块的命名空间
          第二:创建了一个变量 指向这个命名空间
          第三:执行这个文件
        import time,os,random,my_module
        模块虽然一行可以导入多个,但是不推荐这样使用
         as语法:
         import time as t
         t.time()

        time这个名字就失效的,只剩下t了
     from  import 语法:
      from time import time
      time()
       不管是import 还是from import
      都是执行完整的那个被导入的文件
      并且所有的文件的导入 都不会破坏模块中本身的命名空间
      如果是import 模块名
      那么是模块名 指向 整个文件的命名空间
      如果是from 模块名 import 变量名
      那么 是在本文件中创建了同名的变量名 指向模块中的变量值
      导入多个变量,并且重命名
        from my_module import a,b,read
        from my_module import a as aa,b as bb,read as r
        print(a)
        print(aa)
        aa 和a都存在
      from my_module import *  # *表示导入模块中所有的变量和函数 
     # 可以在模块中使用__all__=['变量或方法'] 限制*导入的内容均为列里的变量或方法 但是指定导入变量或方法名不受影响

    模块导入时的三个问题:

    # 1 模块的搜索路径 import sys print(sys.path)   #查看当前文件的系统路径 如果没有所要导的模块或包的路径 就无法正常导入  会提示:ModuleNotFoundError: No module named 'test3' sys.path.append(r'D:PyCharmProjects20day26demo')  #将所要导的包或模块添加到系统路径 print(sys.path) import module1
    # 模块之间的循环导入
    #   在a.py import b
    #   在b.py import a
    
    #a.py
    import b
    
    aaa= '111'
    print(aaa)
    
    #b.py
    import a
    
    bbb =222
    print(bbb)
    
    '''
    执行a.py的结果    #先导入b(这时执行b,b先执行导入a,执行a,但此时a已经执行过导入b.所以就不再执行这一步了,接着执行aaa,print(aaa)就到得了第一个答应结果
    111          #然后返回b,接着执行bbb,print(bbb),得到第二个打印结果
    222          #最后又返回a 接着执行aaa,print(aaa) 得到第三个打印结果
    111          
    '''
    
    
    #循环导入的时候如果提前调用导入模块中的变量或方法会报错
    
    #a.py
    import b
    
    aaa= '111'
    print(b.bbb)
    
    #b.py
    import a
    
    bbb =222
    print(a.aaa)
    
    #执行a.py 会报错  AttributeError: module 'b' has no attribute 'bbb'
    #这是因为循环导入时还没完成导入就开始调用b中内容当然就报错
    #可以使用__name__ == '__main__'来避免这个错误

    import b

    aaa= '111'
    if __name__ =='__main__':
    print(b.bbb)



    
    
    #  3  模块一旦被导入 再修改这个模块对应的文件也是不会生效的
    import time
    import my_module
    
    print(my_module.a)
    time.sleep(10)      #在这期间去修改my_module中的变量并不会对目前这个导入生效
    print(my_module.a)
    
    
    import sys
    print(sys.path)
    二. 包的导入
      

      包是一种通过使用‘.模块名’来组织python模块名称空间的方式。

    
    

      1. 无论是import形式还是from...import形式,凡是在导入语句中(而不是在使用时)遇到带点的,都要第一时间提高警觉:这是关于包才有的导入语法

    
    

      2. 包是目录级的(文件夹级),文件夹是用来组成py文件(包的本质就是一个包含__init__.py文件的目录)

    
    

      3. import导入文件时,产生名称空间中的名字来源于文件,import 包,产生的名称空间的名字同样来源于文件,即包下的__init__.py,导入包本质就是在导入该文件

    
    

      强调:

    
    

        1. 在python3中,即使包下没有__init__.py文件,import 包仍然不会报错,而在python2中,包下一定要有该文件,否则import 包报错

    
    

        2. 创建包的目的不是为了运行,而是被导入使用,记住,包只是模块的一种形式而已,包即模块

    
    

       注意事项

    
    


      1.关于包相关的导入语句也分为import和from ... import ...两种,但是无论哪种,无论在什么位置,在导入时都必须遵循一个原则:凡是在导入时带点的,点的左边都必须是一个包,否则非法。

        可以带有一连串的点,如item.subitem.subsubitem,但都必须遵循这个原则。

        (需要注意的是from后import导入的模块,必须是明确的一个不能带点,否则会有语法错误,如:from a import b.c是错误语法)

    
    

      2.对于导入后,在使用时就没有这种限制了,点的左边可以是包,模块,函数,类(它们都可以用点的方式调用自己的属性)。

    
    

      3.对比import item 和from item import name的应用场景:
        如果我们想直接使用name那必须使用后者。

    #import 导入
    import glance.api.policy
    glance.api.policy.get()
    #from import导入 from glance.api import policy policy.get()
    from glance.api.policy import get
    get()
     
      使用from import import后面至少是精确到模块的
      import后面不能有.
      from后面可以有.,但是.的左边永远是包名
     
    
    
    # 扩展内容: import一个包 这么包中的内容就都可以用了
    import glance
    #但是glanc目录下的__init__文件必须写:
    '''
    from glance import api
    from glance import cmd
    from glance import db
    '''
    print(glance)
    print(glance.api)    
    print(glance.api.policy) glance.api.policy.get()    #同理 api下的__init__写
    from glance.api import policy

    '''
    <module 'glance' from 'D:\飞秋下载\feiq\Recv Files\day26\glance\__init__.py'>
    <module 'glance.api' from 'D:\飞秋下载\feiq\Recv Files\day26\glance\api\__init__.py'>
    <module 'glance.api.policy' from 'D:\飞秋下载\feiq\Recv Files\day26\glance\api\policy.py'>
    from policy.py

    '''
    
    
    
    软件的开发规范:
    # --项目名称
        # -- bin  一个项目的启动文件装在这个文件夹下
            # -- strat.py
        # -- conf config配置,配置文件
            # -- settings.py 可能会发生改变的配置信息
        # -- core 核心代码
            # -- 相关文件 实际的python代码所在的文件
            # -- user.py
            # -- auth.py
            # -- main.py
        # -- lib  库
        # -- db   database 数据库 一堆数据文件,不一定是py文件
        # -- log  日志
    # userinfo
    
    
    
     
     
















  • 相关阅读:
    Java 注解
    java 编码设计细节
    快捷键大全
    java 常用方法
    用SelectSingleNode()方法查找xml节点一直返回null
    未能加载文件或程序集“microsoft.Build.Engine, Version=3.5.0.0,...”或它的摸一个依赖项。
    引用dll出现了黄色感叹号
    保持控件和容器之间的相对位置
    DataGridView中EnditCommit()调用之后,单元格的内容被全选了,每次输入都要鼠标点击定位到最后才能继续输入
    访问DataGridView的Rows报了OutOfIndexRangeException错误
  • 原文地址:https://www.cnblogs.com/stron/p/10656839.html
Copyright © 2011-2022 走看看