模块

一.模块的定义与分类

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文件名不应该与模块名(内置的,第三方)冲突

 

posted @ 2019-07-16 16:34  s686编程传  阅读(177)  评论(0编辑  收藏  举报