Python 中模块及其导入方式

模块

模块的概念:模块就是一组功能的集合体,我们的程序可以导入模块来复用模块里的功能。

模块的定义:创建一个 py 文件就是一个模块,该 py 文件名就是模块名。

模块的使用:在要使用模块的文件中,通过 import 模块名 来导入模块。

模块的通用类别:

1 使用python编写的.py文件
2 已被编译为共享库或DLL的C或C++扩展
3 把一系列模块组织到一起的文件夹(注:文件夹下有一个__init__.py文件,该文件夹称之为包)
4 使用C编写并链接到python解释器的内置模块

import module 导入模块后对应的操作:

  1. 编译执行模块所对应的 py 文件,形成对应的 pyc 文件
  2. 产生该模块自己的全局名称空间
  3. 在使用该模块的全局名称空间中产生一个名字(导入的模块名)

导入模块是要注意点:
1.每一个文件都会产生自己的全局名称空间,且相互不影响
2.多次导入,只会编译执行模块一次,将其加载到内存,之后的都是直接对名字的引用

使用模块的优点:
1.从文件级别组织代码,是同特性的功能能统一管理
2.可以使用系统或第三方模块(拿来主义),来提高开发效率

起别名

通过as关键字可以给模块起别名: 模块名一旦起别名,原模块名就不能再使用,为已经导入的模块起别名的方式对编写可扩展的代码很有用。

优点:

1.可以简化模块名字
2.可以统一功能

# 1.可以简化模块名字
import mmmmm3 as my_m3
print(my_m3.num)
# 2.可以统一功能
cmd = input('数据库选择 1:mysql | 2:oracle:')
if cmd == '1':
    import mysql as db
    # mysql.excuse()
else:
    import oracle as db
    # oracle.excuse()
db.excuse()

假设有两个模块xmlreader.py和csvreader.py,它们都定义了函数read_data(filename):用来从文件中读取一些数据,但采用不同的输入格式。可以编写代码来选择性地挑选读取模块

if file_format == 'xml':
    import xmlreader as reader
elif file_format == 'csv':
    import csvreader as reader
data=reader.read_date(filename)

from导入

from 模块名 import 名字1, 名字2, …, 名字n
利用from导入可以指名道姓导入模板中所有想导入的名字。

使用from导入与import导入的区别:
使用from…import…则是将spam中的名字直接导入到当前的名称空间中,所以在当前名称空间中,直接使用名字就可以了、无需加前缀:spam.

from...import...的方式有好处也有坏处
  	好处:使用起来方便了
    坏处:容易与当前执行文件中的名字冲突

from  模块名 import *
导入的是模块中的__all__这个列表
1、系统默认该列表不会收录_开头的名字
2、可以自定义__all__列表来规定外界通过*可以导入的名字

大部分情况下我们的python程序不应该使用这种导入方式,因为*你不知道你导入什么名字,很有可能会覆盖掉你之前已经定义的名字。而且可读性极其的差。

例如模块中有变量名 a
from  模块名 import *
# 可以使用模块中的a
a = 20
# 模块中的a就被覆盖了,且在代码上还不能直接看出

利用from导入时起别名

from 模板名 import 名字1 as 别名1, ..., 名字n as 别名n

自执行与模块区别

编写好的一个python文件可以有两种用途:
一:脚本,一个文件就是整个程序,用来被执行
二:模块,文件中存放着一堆功能,用来被导入使用

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

作用:用来控制.py文件在不同的应用场景下执行不同的逻辑
if __ name __ == ‘__ main __’:

__name__:
1.在py文件作为模块被使用时,__name__为模块名
2.在py文件自执行时,__name__为字符串 '__main__'


print("共有逻辑")
if __name__ == '__main__':
    # 所有自执行的逻辑
    print("m6: 我是自执行的")
    a = 10  # 产生的是全局的名字
else:
    # 所有模块的逻辑
    print("m6: 我被导入执行的")
    print(a)  # 会报错:走else就不可能走if,所以a压根没产生
posted @ 2019-04-08 18:49  linwow  阅读(193)  评论(0编辑  收藏  举报