zoukankan      html  css  js  c++  java
  • 模块

    一.模块初识

    什么是模块:

      模块:就是一系列功能的集合
        模块的三种来源:
        1.内置模块(python解释器自带)
        2.第三方模块
        3.自定义模块


      模块的四种表现形式
        1.使用python编写的py文件(一个py文件也可以称为一个模块)
        2.已被编译为共享库或DLL的C或C++扩展
        3.把一系列模块组织到一起的文件夹(有一个__init__.py文件的文件夹被称为包)包:一系列py文件的结合体
        4.使用C编写并连接到python解释器的内置模块

    为什么要用模块:
        1.调用别人成熟的模块(内置的,第三方的)可以极大的提高使用者的开发效率
        2.当项目规模过大时,为了使程序结构清晰,方便进行管理
      可以把多个文件所需要的公共方法写入一个叫common.py文件中,其他的文件以模块的形式直接调用即可

     如何使用模块:

        模块的使用方法有两种,是import和from.....import......

        使用模块的关键是区分执行文件和被导入文件。

        可以使用__name__方法进行测试,返回值是__main__时,说明文件是可执行文件,返回模块名(没有后缀)时是被导入文件。

        ps : if __name__ == '__main__':  # 快捷写法 main+tab/enter键即可

    二.模块使用之import

    使用方法 :import  模块名

    import sys # 推荐一行一个模块
    View Code

    右键运行执行的.py文件首先会创建一个该执行文件的名称空间
      首次导入模块xxx.py,执行的三件事
      1.执行xxx.py文件
      2.运行xxx.py文件中的代码将产生的名字与值存放到xxx.py名称空间中
      3.在执行文件中产生一个指向名称空间的名字(xxx)

    重复模块只会在第一次导入时,被执行。(第一次执行过后,模块名被写进sys.module,当模块在sys.module存在时,不会被执行)

    ps :可以从sys.module中找到当前已经加载的模块.

    import diaobao  # 推荐一行一个模块
    import sys # 推荐一行一个模块
    
    import diaobao as db
    
    print(sys.modules)  # 查看已加载模块
    View Code

    使用import导入模块 访问模块中变量的方法:模块名.名字
    1.指名道姓的访问模块中的名字 永远不会与执行文件中的名字冲突
    2.必须用模块名.名字的方式访问模块中的名字

    import可以一次导入多个模块(不推荐使用,看起来代码逻辑不够清晰)

    ps:通常导入模块,会写在文件的开头

    模块名重命名 import 模块名 as 修改后的模块名

    import  sys,diaobao  # 不推荐使用
    import diaobao  # 推荐一行一个模块
    
    import diaobao as db
    
    
    print(db.x)
    View Code

    三.模块使用之from......import .....

    使用方法 :from   模块名 import  变量

    from diaobao import x  # 推荐一行一个模块
    View Code

    会创建一个该执行文件的名称空间
      首次导入xxx.py模块
      1.执行xxx.py文件
      2.运行xxx.py文件中的代码将产生的名字与值存放到xxx.py名称空间中
      3.直接拿到指向模块xxx.py名称空间中某个值的名字

    from...import...:

       优点:引用模块中的名字不用加前缀(模块名),使用更为简洁

       缺点:模块中的名字容易与当前执行文件名称空间中的名字冲突

    import sys # 推荐一行一个模块
    from diaobao import x  # 推荐一行一个模块
    
    print(x)
    
    x = 30
    
    print(x)
    View Code

    from md1 import *  # 一次性将md1模块中的名字全部加载过来 不推荐使用 

    当所在的py文件被当作模块导入时候,可以该py文件内部使用__all__方法,限制导入者拿到的名字个数

    __all__ = ["x"]  # 模块被调用时只能访问变量x
    x = "被调用对象"
    y = 20
    View Code

    四.循环导入

    循环导入问题出现的原因: 程序设计不合理

    假如循环导入问题出现,解决方式如下
        1.方式1
          将导入写在文件最下方(或者被调用的变量之后,导入模块)

        2.方式2
          函数内导入模块

    from dir1.dir import m1
    
    m1.f1()
    View Code
    print('正在导入m1')
    def f1():
      from dir1.dir.m2 import y,f2
      print('m1.f1>>>y:',y)
      f2()
    x = 'm1'
    View Code
    print('正在导入m2')
    def f2():
      from dir1.dir.m1 import x
      print('m2.f2>>>x:',x)
    y = 'm2'
    View Code

    五.模块的查找顺序

    模块的查找顺序
        1.先从内存中找
        2.内置中找
        3.sys.path中找(环境变量):

          sys.path是一个大列表,里面放了一对文件路径,第一个路径永远是执行文件所在的文件夹

    print(sys.path)
    View Code

    六.绝对路径和相对路径

      绝对导入必须依据执行文件所在的文件夹路径为准
        1.绝对导入无论在执行文件中还是被导入文件都适用

    相对导入
        .代表的当前路径
        ..代表的上一级路径
        ...代表的是上上一级路径

    ps:相对导入不能在执行文件中使用,只能在被导入的模块中使用使用相对导入

         不需要考虑执行文件到底是谁 只需要知道模块与模块之间的路径关系

    七.软件目录开发规范

    项目名
      bin文件夹
        start.py项目启动文件
      conf文件夹
        settings.py项目配置文件
      core文件
        src.py项目核心逻辑文件
      db文件夹
        数据库文件
      lib文件夹
        common.py项目所用到的公共的功能
      log文件夹
        项目的日志文件
      readme文本文件 介绍项目

    # start.py 
    
    import sys
    import os
    
    BASE_DIR = os.path.dirname(os.path.dirname(__file__))
    sys.path.append(BASE_DIR)
    # "os.path.dirname(__file__)"拿到的是当前start.py文件所在的上一层目录
    
    """
    pycharm会自动把项目的最顶层的目录自动添加到sys.path中
    
    """
    from core import src
    
    if __name__ == '__main__':
        src.run()
    View Code
  • 相关阅读:
    物联网市场碎片化严重 物联网网关设计挑战重重
    物联网市场碎片化严重 物联网网关设计挑战重重
    物联网市场碎片化严重 物联网网关设计挑战重重
    越做越大的行李寄存生意,老板竟是3个95后
    互联网人失业理由排行榜,每一个都戳破职场真相
    读小说赚钱吗?这个年入百万
    BI驾驶舱的必备知识
    2019开源BI软件排行榜
    主流的开源bi工具
    企业为什么需要BI决策系统?
  • 原文地址:https://www.cnblogs.com/Cpsyche/p/11196329.html
Copyright © 2011-2022 走看看