Python模块的魅力学习笔记
- 更多分享:http://www.catbro.cn
一、前言
- 前面我们学习了python的基本知识,从数据结构到面向对象、生成器等。
- 本次,我们将学习python中模块的相关概念的使用
- 大家都知道,我们在安装python的时候会安装一组模块,一般称为标准库-standard library,之前我们也用到了一些模块如:math、cmath。
- 那么模块我们要学习什么呢?了解模块的工作方式
二、模块
- 当你使用import语句的时候,你也就接触了模块的概念了,import math即表示导入math模块。
三、模块就是程序
-
任何Python程序都可以作为模块导入。
-
如:创建一个hello模块。并将其保存为hello.py文件
print('hello ,i am module');
-
使用如下:
import com.xxx.hello
-
试着运行一下你会发现,输出了hello,i am module。可是我只是导入而已呢,我并没有做什么。
-
我们试着执行两句 import com.anjieguan.hello 语句,发现其也只输出了一句hello,i am module。这说明,模块在导入的时候会被执行,而且多次导入只会执行一次哦。
四、模块的魅力
-
OK,从上面我们了解到,模块在导入时会被执行。但是这感觉并没有什么用。
-
其实模块的魅力所在在于模块像类一样,它们可以拥有自己的作用域。
-
这会带来什么影响呢?这样子可以做到–在模块内定义的所有类和函数以及赋值后的变量都称为类模块的特性。
-
OK,我们修改一下hello模块,在外层包裹一个say_hello方法。
def say_hello(): print('hello ,i am module');
-
此时你会发现,导入的时候不会在输出hello ,i am module语句了。为什么呢?很简单,在导入模块的时候,模块的代码被执行了,其执行的结果是定义了一个say_hello方法以及方法内部的实现,但是我们并没有调用say_hello方法,当然不会输出hello ,i am module语句了。
-
现在我们来调用一下看下:
from com.xxx.hello import say_hello say_hello();
-
可以看到,hello ,i am module语句输出了。
-
当然,我们也可以将其封装为类,将say_hello封装为类方法,这样可以不实例话对象也可以直接通过类名调用
class hello: @classmethod def say_hello(cls): print('hello ,i am module');
-
调用如下:
from com.xxx.hello import hello hello.say_hello();
-
其同样输出了hello ,i am module语句。
五、为什么要有模块呢?
- Ok,通过前面,我们大致了解了模块的创建及导入流程,那么为什么要有模块的存在呢?
- 我直接写在主程序中不也可以么?
- 其主要原因是代码的重用,假设你有一段代码,在A程序中需要调用到,在B程序中也需要调用到,copy是最差的编码方式,此时封装为模块是不是就可以公用了呢?
六、为模块编写测试代码
-
我们编写了模块,单有时候我们需要检测模块本身的运行是否正常,这在实际工作中往往是必须的。不用担心,python已经为我们想好了。
-
_name_
变量的使用。程序被调用的时候,如果是以主程序的形式运行,_name_
变量的值是_main_
,如果是作为模块被导入,其值为模块的名字,Ok,我们为hello模块添加一个测试代码class hello: @classmethod def say_hello(cls): print('hello ,i am module'); def test(): hello.say_hello(); print('__name__ value is : %s'%__name__) if __name__ == '__main__': test();
-
直接运行hello模块输出:
__name__ value is : __main__ hello ,i am module
-
导入模块后调用输出:
__name__ value is : com.xxx.hello hello ,i am module
七、如果学习新的模块
- Python标准库中存在非常多的模块,而且还在不断的增长,作为程序员,我们在编程过程中不可变面的要使用各种模块,(当然,除非你全部自己从0开始写)。当使用一个陌生的木块时,我们该如何去了解其都提供了什么特性呢?
1、dir函数的使用:dir函数会讲对象、模块内的所有函数、类、变量等列出来。
-
一般特性前有下划线的是外部不可调用的,我们可如下进行一次过滤
from com.anjieguan.hello import hello for n in dir(hello): if not n.startswith('_'): print(n);
-
输出类我们的say_hello方法。你可以试着打印math模块。
2、__all__
:其定义了模块的公共接口
- 也可以这样理解,其高速python解释器,从模块导入所有的名字代表什么含义。如果你执行from math import *,你只能使用
__all__
变量中的函数。 - 所以我们在编写自己的模块时,适当的使用all变量是非常有用的。