zoukankan      html  css  js  c++  java
  • 模块

    一.模块的定义与分类

    1.模块是什么?
    模块就是一系列功能的结合体

    2.为什么要使用模块?

      从文件级别组织程序,更方便管理,随着程序的发展,功能越来越多,为了方便管理

      拿来主义,提升开发效率

    一定要区分哪个是执行文件,哪个是被导入文件(************)

    3.模块的分类

    python语言中,模块分为三类:

      第一类:内置模块,也叫做标准库

      第二类:第三方模块

      第三类:自定义模块

    二.import

    1.import的使用

      import就是导入的意思

      使用import导入模块 访问模块名称空间中的名字统一句势:模块名.名字
      1.指名道姓的访问模块中的名字 永远不会与执行文件中的名字冲突
      2.你如果想访问模块中名字 必须用模块名.名字的方式

    2.第一次导入模块执行三件事:

      右键运行run.py文件首先会创建一个run.py的名称空间 

      首次导入模块(md1.py)(******)
        1.执行md.py文件
        2.运行md.py文件中的代码将产生的名字与值存放到md.py名称空间中
        3.在执行文件中产生一个指向名称空间的名字(md)

      多次导入不会再执行模块文件,会沿用第一次导入的成果(******)

    3.被导入的模块有独立的名称空间

    每个模块都是一个独立的名称空间,定义在这个模块中的函数,把这个模块的名称空间当作全局名称空间,这样我们在编写自己的模块是,不需要担心定义在自己模块中全局变量会在被导入,与使用者的全局变量冲突。

    #md py文件
    money = 1000
    def read1():
        print('md',money)
    
    
    #run py文件
    import md
    money = 9999
    def read1():
        print('from run read1')
    
    
    print(money)  #9999
    print(md.money) #1000
    read1()  #from run read1
    md.read1() #md1000

    4.为模块起别名

    import mdddddddddddddddd as md

      好处可以将很长的模块名改成很短的,方便使用

      有利于代码的扩展和优化:

    举例:

    #mysql.py
    def sqlparse():
        print('from mysql sqlparse')
    #oracle.py
    def sqlparse():
        print('from oracle sqlparse')
    ​
    #test.py
    db_type=input('>>: ')
    if db_type == 'mysql':
        import mysql as db
    elif db_type == 'oracle':
        import oracle as db
    ​
    db.sqlparse()

    5.导入多个模块

    import os,sys,json   # 这样写可以但是不推荐
    #推荐写法
    import os
    import sys
    import json

    多行导入模块:易于阅读,易于编辑,易于搜索,易于维护

    三.from..import...

    1.from..import..的使用

    from md impot money
    print(money) #1000

    2.from..import..与import对比

    唯一的区别就是:from..import..能够将变量,或者函数直接导入到当前的名称空间中,用的时候无需再加上前缀

    缺点是:容易与当前的执行文件中变量名起冲突

    from..import*能够将导入模块中的名字全部加载过来,但是不推荐使用,因为如果模块中名字太多,分不清或者找不到这些名字

    __all__可以指定当所在py文件被当做模块导入的时候
    可以限制导入者能够拿到的名字个数

    money = 1000
    def read1():
      print('md',money)
    __all__ = ['money','read1','read2']
    #当导入此模块时 from md import*时 只会导入__all__中的名字

    3.模块循环导入问题

    模块循环/嵌套导入抛出异常的根本原因是由于在python中模块被导入一次之后,就不会重新导入,只会在第一次导入时执行模块内代码

        在我们的项目中应该尽量避免出现循环/嵌套导入,如果出现多个模块都需要共享的数据,可以将共享的数据集中存放到某一个地方在程序出现了循环/嵌套导入后的异常分析、解决方法如下 

          1.方式1
            将循环导入的句式写在文件最下方()
          2.方式2
            函数内导入模块

    #执行文件 run
    import m1
    m1.f1()
    
    
    #m1.py模块
    
        #方法一    
    print('正在导入m1')
    x = 'm1'
    from m2 import y#首次导入m2
    
        #方法二
    print('正在导入m1')
    def f1():
      from m2 import y,f2
      print('m1.f1>>>y:',y)
      f2()
    x = 'm1'
    
    
    
    
    #m2.py模块
        #方法一
    print('正在导入m2')
    y = 'm2'
    from m1 import x#第二次导入m1
        #方法二
    print('正在导入m2')
    def f2():
      from m1 import x
      print('m2.f2>>>x:',x)
    y = 'm2'

    四. __name__的用法

    python为我们内置了全局变量__name__,
       当文件被当做脚本执行时:__name__ 等于'__main__'
       当文件被当做模块导入时:__name__等于模块名

    if __name__ == '__main__':
        run()

    五.模块的查找顺序

    模块的查找顺序
    1.先从内存中找
    2.内置中找
    3.sys.path中找(环境变量):
    一定要分清楚谁是执行文件谁是被导入文件(******)

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

    注意py文件名不应该与模块名(内置的,第三方)冲突

    万般皆下品,唯有读书高!
  • 相关阅读:
    详解Python模块导入方法
    第15天上课例子,sqllchemy运用
    【Demo 0075】获取系统进程列表
    【Demo 0076】获取进程中模块列表
    【Demo 0071】托盘小工具
    【Demo 0070】读取EXE\DLL中ICON
    【Demo 0073】复合文件拼拆
    【Demo 0072】启动外部应用程序
    【Demo 0078】获取系统版本信息
    【Demo 0079】进程继承关系
  • 原文地址:https://www.cnblogs.com/s686zhou/p/11195800.html
Copyright © 2011-2022 走看看