一, python 中的模块
有过 C 语言编程经验的朋友都知道在 C 语言中如果要引用 sqrt 函数, 必须用语句 #include <math.h > 引入 math.h 这个头文件, 否则是无法正常进行调用的.
那么在 Python 中, 如果要引用一些其他的函数, 该怎么处理呢?
在 Python 中有一个概念叫做模块 (module), 这个和 C 语言中的头文件以及 Java 中的包很类似, 比如在 Python 中要调用 sqrt 函数, 必须用 import 关键字引入 math 这个模块, 下面就来了解一下 Python 中的模块.
说的通俗点: 模块就好比是工具包, 要想使用这个工具包中的工具 (就好比函数), 就需要导入这个模块
模块的概念:
每一个以扩展名 py 结尾的 python 源代码文件都是一个模块
模块名同样也是一个标识符, 需要符合标识符的命名规范
在模块中定义的全局变量, 函数, 类都是提供给外界直接使用的工具
模块就好比工具包, 要想使用这个工具包中的工具, 就需要先导入这个模块
二, import
在 Python 中用关键字 import 来引入某个模块, 比如要引用模块 math, 就可以在文件最开始的地方用 import math 来引入.
import 导入
import 模块名 1, 模块名 2 #不推荐
说明: 在导入模块时, 每个导入应该独占一行 (推荐)
import 模块 1
import 模块 2
导入之后
通过模块名使用模块提供的工具 --- 全局变量, 函数, 类
只用 as 指定模块的别名
如果模块的名字太长, 可以使用 as 指定模块的别名, 以方便在代码中的使用
import 模块名 1 as 模块别名
注意: 模块别名应该符合托峰值命名规范
为什么要加上模块名呢?
因为可能存在这样一种情况: 在多个模块中含有相同名称的函数, 此时如果只是通过函数名来调用, 解释器无法知道到底要调用哪个函数. 所以如果像上述这样引入模块的时候, 调用函数必须加上模块名
三, from ... import
from...import 导入
如果想从某一模块中导入部分工具, 就可以使用 from...import 的方式
import 模块名是一次性把模块中所有的工具全部导入, 并且通过模块名 / 别名访问
# 从模块中导入某一个工具
from 模块名 import 工具名 #可以通过 as 为工具指定别名
导入之后
不需要通过模块名. 的方式使用模块提供的工具
可以直接使用模块提供的工具 --- 全局变量, 函数, 类
注意:
如果两个模块, 存在同名的函数, name 后导入模块的函数会覆盖先导入的函数
开发时 import 代码应该统一写在代码的顶部, 更容易及时发现冲突
一定大仙冲突, 可以使用 as 关键字, 给其中一个工具起一个别名
- from...import *
- # 从模块中导入所有工具
from 模块名 import *
注意:
这种法师不推荐使用, 因为函数重名并没有任何的提示, 出现问题不好排查
案例:
- demo.py(自定义的模块)
- # 全局变量
- title = "模块 1"
- # 函数
- def say_hello():
- print("我是 %s"%title)
- # 类
- class Dog(object):
- pass
- # 类
- class Cat(object):
- pass
test.py 中使用 demo.py 模块
- # 导入模块中的所有工具, 同时为模块指定别名为 myTest
- import demo as myTest
- # 导入模块中所有工具, 不推荐, 工具同名不好排查
- #from...import *
- #from...import 导入模块中的部分工具 (Dog 类)
- from demo import Dog
- # 为导入工具 Cat 类指定别名 Test_Cat, 防止与其他模块中工具重名
- from demo import Cat as Test_Cat
- myTest.say_hello()
- dog=Dog()
- cat=Test_Cat()
四, python 模块导入的搜索路径
程序的主目录
PTYHONPATH 目录 (如果已经进行了设置)
标准连接库目录 (一般在 / usr/local/lib/python2.X/)
任何的. pth 文件的内容 (如果存在的话). 新功能, 允许用户把有效果的目录添加到模块搜索路径中去 .pth 后缀的文本文件中一行一行的地列出目录.
这四个组建组合起来就变成了 sys.path 了,
当 python import 模块的时候, 就通过 sys.path 里面的目录列表下面去查找.
sys.path 是 python 的搜索模块的路径集, 是一个 list.
查看 sys.path 方法:
- import sys
- print(sys.path)
- ['C:\\Users\\Se7eN_HOU\\Desktop\\Tools\\sublimetext3\\Sublime Text Build 3176 x86',
- 'C:\\Program Files\\Python37\\python37.zip',
- 'C:\\Program Files\\Python37\\DLLs',
- 'C:\\Program Files\\Python37\\lib',
- 'C:\\Program Files\\Python37',
- 'C:\\Users\\Se7eN_HOU\\AppData\\Roaming\\Python\\Python37\\site-packages',
- 'C:\\Program Files\\Python37\\lib\\site-packages']
程序执行时导入模块路径
- import sys
- # 因为 sys.path 是一个列表, 所以可以在后面追加一个自定的模块路径
- sys.path.append("/home/Se7eN_HOU")
- # 通过 insert 可以将路径插到前面
- sys.path.insert(0,"Home/Se7eN")
- print(sys.path)
运行结果为:
- ['Home/Se7eN',
- 'C:\\Users\\Se7eN_HOU\\Desktop\\Tools\\sublimetext3\\Sublime Text Build 3176 x86',
- 'C:\\Program Files\\Python37\\python37.zip', 'C:\\Program Files\\Python37\\DLLs',
- 'C:\\Program Files\\Python37\\lib', 'C:\\Program Files\\Python37',
- 'C:\\Users\\Se7eN_HOU\\AppData\\Roaming\\Python\\Python37\\site-packages',
- 'C:\\Program Files\\Python37\\lib\\site-packages',
- '/home/Se7eN_HOU']
五, 模块制作
1, 定义自己的模块
在 Python 中, 每个 Python 文件都可以作为一个模块, 模块的名字就是文件的名字.
比如有这样一个文件 test.py, 在 test.py 中定义了函数 add
- def add(a,b):
- return a+b
2, 调用自己的模块
那么在 demo.py 文件中就可以先 import test, 然后通过 test.add(a,b) 来调用了, 当然也可以通过 from test import add 来引入
- import test
- result = test.add(1,2)
- print(result)
运行结果为: 3
3, 测试模块
在实际开中, 当一个开发人员编写完一个模块后, 为了让模块能够在项目中达到想要的效果, 这个开发人员会自行在 py 文件中添加一些测试信息, 例如: test.py 文件
- def add(a,b):
- return a+b
- # 用来测试
- ret = add(11,22)
- print("in test.py 测试 11+22 = %d"%ret)
如果此时, 在 demo.py 文件中引入了此文件的话, 想想看, 测试的那段代码是否也会执行呢!
- import test
- result = test.add(1,2)
- print(result)
运行结果为:
in test.py 测试 11+22 = 33
3
至此, 可发现 test.py 中的测试代码, 应该是单独执行 test.py 文件时才应该执行的, 不应该是其他的文件中引用而执行. 为了解决这个问题, python 在执行一个文件时有个变量__name__
test.py 文件中:
- def add(a,b):
- return a+b
- # 用来测试
- #ret = add(11,22)
- #print("in test.py 测试 11+22 = %d"%ret)
- print("in test.py,__name__ is %s"%__name__)
运行结果为:
in test.py,__name__ is __main__
在 demo.py 文件中导入 test.py 模块运行为
- import test
- result = test.add(1,2)
- print(result)
运行结果为:
- in test.py,__name__ is test
- 3
可以根据__name__变量的结果能够判断出, 是直接执行的 python 脚本还是被引入执行的, 从而能够有选择性的执行测试代码
test.py 模块中代码改为:
- def add(a,b):
- return a+b
- if __name__ == "__main__":
- ret = add(11,22)
- print("in test.py 测试 11+22 = %d"%ret)
在 test.py 中运行结果为:
in test.py 测试 11+22 = 33
在 demo.py 中导入 test.py 模块
- import test
- result = test.add(1,2)
- print(result)
运行结果为: 3
这样我们在开中测试的代码, 就不会在其他模块中出现了.
六, 模块中的_ _all_ _
1, 没有_ _all_ _
test.py 模块
- class Test(object):
- def test(self):
- print("---Test 类中的 test 方法 ---")
- def test1():
- print("---test1 方法 ---")
- def test2():
- print("---test2 方法 ---")
在 demo.py 中导入 test.py 模块
- from test import *
- a = Test()
- a.test()
- test1()
- test2()
运行结果为:
---Test 类中的 test 方法 ---
---test1 方法 ---
---test2 方法 ---
2, 模块中有_ _all_ _
test.py 模块
- __all__ = ["Test","test1"]
- class Test(object):
- def test(self):
- print("---Test 类中的 test 方法 ---")
- def test1():
- print("---test1 方法 ---")
- def test2():
- print("---test2 方法 ---")
demo.py 模块
- from test import *
- a = Test()
- a.test()
- test1()
- test2()
运行结果为:
---Test 类中的 test 方法 ---Traceback (most recent call last):
---test1 方法 ---
- File "C:\Users\Se7eN_HOU\Desktop\Tools\sublimetext3\Sublime Text Build 3176 x86\demo.py", line 5, in <module>
- test2()
- NameError: name 'test2' is not defined
如果一个文件中有__all__变量, 那么也就意味着只有这个变量中的元素, 才会被 from xxx import * 时导入
来源: https://www.cnblogs.com/Se7eN-HOU/p/10710272.html