Python学习笔记(17)-模块、包

模块

Python中一个.py文件就是一个模块,我们可以通过引入模块来使用模块中的功能

import

引入模块的方法:import  模块名

使用模块中功能的方法:模块名.功能(功能指类或者函数等)

示例:

import test_msg
test_msg.test()

运行结果:

---test---

注意:

1、test_msg.py中代码

def test():
    print("---test---")

2、import 模块名时不要带.py后缀,如错误示例 import test_msg.py

3、模块分三种:系统自带的模块如random,下载安装的第三方模块如pygame,自己写的自定义模块如上面的test_msg,其中要想引入自定义的模块test_msg,执行import test_msg代码的位置要与模块处于同一层目录下

from   import

如果想直接引入模块中的某一部分功能,引入的方法为from 模块名 import 功能1,功能2.....等

示例:

from test_msg import test1,test2
test1()
test2()

运行结果:

---test1---
---test2---

说明:

1、test_msg.py中代码

def test1():
    print("---test1---")
def test2():
    print("---test2---")

2、由于直接引入了功能,所以执行时不再是test_msg.test1()而直接是test1()

3、同样执行代码的位置要与模块处于同一层目录下

from  import *

如果一个模块中的功能非常多,通过写功能名的方式导入有些繁琐,还有种导入模块中功能的方法为from 模块名 import *,*号代表所有功能

示例:

from test_msg import *
test1()
test2()

运行结果:

---test1---
---test2---

注意:

这种导入方式不适合多个模块中有功能名称相同的情况,如两个模块中都有函数名test(),当使用功能时只会使用最后调用的那个

__all__

当以from 模块名 import *方式导入模块功能时,可通过在模块中添加__all__变量来指定允许导入哪些功能

示例:

test_msg.py中代码

__all__ = ["test1","test2"]
def test1():
    print("---test1---")
def test2():
    print("---test2---")
def test3():
    print("---test3---")

执行代码

from test_msg import *
test1()
test2()
test3()

运行结果:

Traceback (most recent call last):
  File "F:/untitled/Python_jichu/模块/main.py", line 4, in <module>
    test3()
---test1---
---test2---
NameError: name 'test3' is not defined

注意:

1、__all__前后为两个下划线

2、__all__类型为列表,每个元素是导入模块中的功能名字的字符串

3、未写入__all__列表中的功能不会被引入

as

如果一个模块名字过长,我们可以通过as将模块重新命名

命名方法:import 模块名 as 自定义模块名

示例:

import test_msg as abc
abc.test1()
abc.test2()
abc.test3()

运行结果:

---test1---
---test2---
---test3---

模块的搜索顺序

当我们导入一个模块时,Python会先从当前路径下搜索,如果当前路径下不存在则搜索系统模块所在路径,系统模块路径可通过打印os.__file__查看,前提是要导入os模块(import os)

__name__==__main__

一个模块被引入的时候会将模块中的代码从头到尾执行一遍

示例:

test_msg中代码

def test1():
    print("---test1---")
def test2():
    print("---test2---")
def test3():
    print("---test3---")
test1()
test2()
test3()

执行代码

import test_msg
test_msg.test1()
test_msg.test2()
test_msg.test3()

运行结果:

---test1---
---test2---
---test3---
---test1---
---test2---
---test3---

很显然调用者只想看到一遍输出结果,但由于引入模块时已经执行了一遍模块中的代码,最终结果显示了两遍,但是编写test_msg模块的人又需要测试代码是否可以正常运行,那么显然将模块中的调用方法删除不是好的处理方式

模块中存在一个变量__name__,如打印这个变量在模块自身执行时输出"__main__",在调用者处执行时输出模块名即"send_msg",那么在模块中只要编写if __name__=="__main__"时才调用方法,那么通过引入模块方式调用功能时则不会执行

示例:

test_msg中代码

def test1():
    print("---test1---")
def test2():
    print("---test2---")
def test3():
    print("---test3---")
if __name__=="__main__":
    test1()
    test2()
    test3()

执行代码

import test_msg
test_msg.test1()
test_msg.test2()
test_msg.test3()

运行结果

---test1---
---test2---
---test3---

注意:

__main__是字符串

 包

多个模块放在一个文件夹中,且文件夹中含有__init__.py文件,这个文件夹称作包

__init__中__all__

想要以from方式从包中引入模块,需要在__init__文件中写入需要引入模块的名字,方式为__all__ = [模块名1,模块名2等]

示例:

 

 

posted @ 2018-09-06 15:02  立鼕  阅读(202)  评论(0编辑  收藏  举报