模块与包

来源:互联网 发布:c语言函数规则 编辑:程序博客网 时间:2024/05/16 06:44

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

使用模块的原因:
如果在python解释器上写程序,当我们退出解释器重新进入,我们之前定义的函数或者变量都将丢失。所以,出于永久保存程序的目的,我们通常会把程序写到文件里,需要的时候可以通过python test.py 的方式去执行,这时的test.py文件被称作脚本。但是往往一个程序都是由各种功能组成的比较复杂的程序,这时我们会将程序分成一个个文件,使得程序结构更加清晰,也便于管理和维护。对于这些文件,我们不仅可以把他当做脚本执行,还可以把他们当做模块导入到其他的模块中,实现了功能的重复利用。

如何导入模块:
1,导入模块名称空间
import modulename
获取模块中的变量:print(modulename.variablename)# 一般都是调方法,很少调变量。
调用模块中的方法(函数):modulename.functionname(para)

import my_moduleprint(my_module.name)my_module.func()

2,导入需要的

from modulename imoprt functionname1(variable1), functionname2(variable2)from my_module import funcfunc()

3,导入全部

from modulename import *
也可以将模块中所有不是以(_)开头的属性和方法名加载到当前模块中,但是不建议这样导入,因为没法预知将导入什么定义,有可能会覆盖之前的定义,并且可读性很差。
ps.导入模块时要尽量避免自己定义的名称和模块中的名称相同。

name = 'david'from my_module import *print(name)
__all__ = ['variablename', 'functionname']

可以在模块文件中增加这一行,这样就能限制用for…import * 导入模块时,导入的变量和函数名有哪些。仅适用于import*。

可以重命名模块名和模块中函数名 使用as关键字
给模块名起别名,对编写可扩展的代码很有用(尤其是当两个模块中有相同的方法名时)
示例:

#mysql.pydef sqlparse():    print('from mysql sqlparse')#oracle.pydef sqlparse():    print('from oracle sqlparse')#test.pydb_type=input('>>: ')if db_type == 'mysql':    import mysql as dbelif db_type == 'oracle':    import oracle as dbdb.sqlparse() 

其他模块相关知识点
1,
出于效率的原因,每个模块仅每个解释器导入一次。
因此, 如果在导入模块后又修改了模块里的内容, 必须重启解释器。——或者,如果想用交互的方式测试模块,可以使用importlib.reload(),例如import importlib; importlib.reload(modulename)。
2,
以脚本的形式执行模块
可以用来控制.py文件在不同的场合下执行不同的逻辑。
表现形式:
在模块底部加上:

if __name__ == '__main__':    pass

例:

def fib(n):       a, b = 0, 1    while b < n:        print(b, end=' ')        a, b = b, a+bif __name__ == "__main__":    print(__name__)    num = input('num :')    fib(int(num))

通过这样设置,就能保证fib()函数既能用作模块里的函数,为另外一个模块的数据做运算又保证了通过脚本的方式运行.py文件时, 也能在交互模式下能调用fib()函数

为什么?
__name__ 是python的内置变量,每个py文件都有。他的默认值就是
'__main__',在解释器里以脚本的形式执行文件时,pass里的程序会被执行
但是,以模块的形式在另一个文件中导入时,__name__的值会变成模块名。
if 条件不成立,pass就不会执行。
查看模块名的方法:导入的模块,print(module.__name__) 当前所在的文件,print(__name__)

模块搜索路径
内存–>内置模块–>sys.path
python解释器在启动时会加载一些模块,可以使用sys,modules查看。
当首次导入某模块时,python会先检查该模块是否已经加载到内存(模块导入后,会被加载到内存,在sys.modules里可以查看,如果关闭解释器,会自动清除,再次查看在sys.modules,里面就没有了。)
有的话,会直接引用(而不是再加载一次)。没有的话,会查找python内置的模块,如果还没有,就会到sys.path给出的列表里依次查找。因此,自定义的模块名一定不要和内置模块名重名。

关于sys.path
sys.path 是一个字符串列表,它决定看模块的解释器搜索路径。
初始的默认路径来自于环境变量PYTHONPATH,如果PYTHONPATH未
设置,则来自于内置的默认值,可以使用标准的列表操作来修改sys.path。

’编译好的’python文件(不会随着解释器的关闭而消失,而是在首次导入模块的时候,就会在执行文件的目录下生成一个具体的pyc文件)

为了加快加载速度, 在导入模块后,python会自动生成一个__pycache__目录,
里面存放着编译好的pcy文件,文件名为 modulename.version.pyc
version 表示的是解释器的版本信息,如:my_module.cpython-36.pyc

内建函数dir是用来查找模块中定义的名字,返回一个有序字符串列表

import my_moduledir(my_module)

如果没有参数, dir()列举出当前定义的名字,dir()不会列举出内建函数或者变量的名字,它们都被定义到了标准模块builtin中,可以列举出它们。

import builtinsdir(builtins)