Skip to content

Commit 2dc5fad

Browse files
committed
module and package
1 parent a00f36e commit 2dc5fad

2 files changed

Lines changed: 39 additions & 20 deletions

File tree

219.md

Lines changed: 28 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -2,13 +2,13 @@
22
33
#编写模块
44

5-
在本章之前,python还没有显示出太突出的优势。本章开始,读者就会越来越感觉到python的强大了。这种强大体现在“模块自信”上,因为python不仅有很强大的自有模块(称之为标准库),还有海量的第三方模块,任何人还都能自己开发模块,正是有了这么强大的“模块自信”,才体现了python的优势所在。并且这种方式也正在不断被更多其它语言所借鉴。
5+
在本章之前,Python还没有显示出太突出的优势。本章开始,读者就会越来越感觉到Python的强大了。这种强大体现在“模块自信”上,因为Python不仅有很强大的自有模块(或者包、库,比如为标准库),还有海量的第三方模块(或者包、库),任何人还都能自己开发模块(或者包、库),正是有了这么强大的“模块自信”,才体现了Python的优势所在。并且这种方式也正在不断被更多其它语言所借鉴。
66

7-
“模块自信”的本质是:开放
7+
“模块自信”的本质是:**开放**
88

9-
python不是一个封闭的体系,是一个开放系统。开放系统的最大好处就是避免了“熵增”。
9+
Python不是一个封闭的体系,是一个开放系统。开放系统的最大好处就是避免了“熵增”。
1010

11-
>熵的概念是由德国物理学家克劳修斯于1865年(这一年李鸿章建立了江南机械制造总局,美国废除奴隶制,林肯总统遇刺身亡,美国南北战争结束。)所提出是一种测量在动力学方面不能做功的能量总数,也就是当总体的熵增加,其做功能力也下降,熵的量度正是能量退化的指标。
11+
>熵的概念是由德国物理学家克劳修斯于1865年(这一年李鸿章建立了江南机械制造总局,美国废除奴隶制,林肯总统遇刺身亡,美国南北战争结束。)所提出是一种测量在动力学方面不能做功的能量总数,也就是当总体的熵增加,其做功能力也下降,熵的量度正是能量退化的指标。
1212
1313
>熵亦被用于计算一个系统中的失序现象,也就是计算该系统混乱的程度。
1414
@@ -22,27 +22,29 @@ python不是一个封闭的体系,是一个开放系统。开放系统的最
2222
>>> math.pow(3,2)
2323
9.0
2424

25-
这里的math就是一个模块,用import引入这个模块,然后可以使用模块里面的函数,比如这个pow()函数。显然,这里我们是不需要自己动手写具体函数的,我们的任务就是拿过来使用。这就是模块的好处:拿过来就用,不用自己重写。
25+
这里的math就是一个库,用import引入这个库,然后可以使用库里面的函数,比如这个pow()函数。显然,这里我们是不需要自己动手写具体函数的,我们的任务就是拿过来使用。这就是库的好处:拿过来就用,不用自己重写。
26+
27+
请读者注意,到现在为止,我们看到了模块、库、包这些名词,并且在开发实践中,也会常常遇到。它们有区别吗?有!只不过,现在我们暂时不区分,就笼统地说,阅读下面的内容,就理解它们之间的区分了。
2628

2729
##模块是程序
2830

29-
这个标题,一语道破了模块的本质,它就是一个扩展名为`.py`的python程序。我们能够在应该使用它的时候将它引用过来,节省精力,不需要重写雷同的代码。
31+
这个标题,一语道破了模块的本质,它就是一个扩展名为`.py`的Python程序。我们能够在应该使用它的时候将它引用过来,节省精力,不需要重写雷同的代码。
3032

31-
但是,如果我自己写一个`.py`文件,是不是就能作为模块import过来呢?还不那么简单。必须得让python解释器能够找到你写的模块。比如:在某个目录中,我写了这样一个文件:
33+
但是,如果我自己写一个`.py`文件,是不是就能作为模块import过来呢?还不那么简单。必须得让Python解释器能够找到你写的模块。比如:在某个目录中,我写了这样一个文件:
3234

3335
#!/usr/bin/env python
3436
# coding=utf-8
3537

3638
lang = "python"
3739

38-
并把它命名为pm.py,那么这个文件就可以作为一个模块被引入。不过由于这个模块是我自己写的,python解释器并不知道,我得先告诉它我写了这样一个文件。
40+
并把它命名为pm.py,那么这个文件就可以作为一个模块被引入。不过由于这个模块是我自己写的,Python解释器并不知道,我得先告诉它我写了这样一个文件。
3941

4042
>>> import sys
4143
>>> sys.path.append("~/Documents/VBS/StartLearningPython/2code/pm.py")
4244

43-
用这种方式就是告诉python解释器,我写的那个文件在哪里。在这个告诉方法中,也用了一个模块`import sys`不过由于sys模块是python被安装的时候就有的,所以不用特别告诉,python解释器就知道它在哪里了
45+
用这种方式就是告诉Python解释器,我写的那个文件在哪里。在这个告诉方法中,也用了Python标准库中的sys,即`import sys`不过由于sys是Python被安装的时候就有的,所以不用特别告诉,Python解释器就知道它在哪里了
4446

45-
上面那个一长串的地址,是ubuntu系统的地址格式,如果读者使用的windows系统,请写你所保存的文件路径。
47+
上面那个一长串的地址,是Ubuntu系统的地址格式,如果读者使用的windows系统,请写你所保存的文件路径。
4648

4749
>>> import pm
4850
>>> pm.lang
@@ -55,19 +57,19 @@ python不是一个封闭的体系,是一个开放系统。开放系统的最
5557
File "<stdin>", line 1, in <module>
5658
AttributeError: 'module' object has no attribute 'xx'
5759

58-
请读者回到pm.py文件的存储目录,是不是多了一个扩展名是.pyc的文件?如果不是,你那个可能是外星人用的python
60+
请读者回到pm.py文件的存储目录,是不是多了一个扩展名是.pyc的文件?如果不是,你那个可能是外星人用的Python
5961

60-
>解释器,英文是:interpreter,港台翻译为:直译器。在python中,它的作用就是将.py的文件转化为.pyc文件,而.pyc文件是由字节码(bytecode)构成的,然后计算机执行.pyc文件。关于这方面的详细解释,请参阅维基百科的词条:[直譯器](http://zh.wikipedia.org/zh/%E7%9B%B4%E8%AD%AF%E5%99%A8)
62+
>解释器,英文是:interpreter,港台翻译为:直译器。在Python中,它的作用就是将.py的文件转化为.pyc文件,而.pyc文件是由字节码(bytecode)构成的,然后计算机执行.pyc文件。关于这方面的详细解释,请参阅维基百科的词条:[直譯器](http://zh.wikipedia.org/zh/%E7%9B%B4%E8%AD%AF%E5%99%A8)
6163
62-
不少人喜欢将这个世界简化简化再简化。比如人,就分为好人还坏人,比如编程语言就分为解释型和编译型,不但如此,还将两种类型的语言分别贴上运行效率高低的标签,解释型的运行速度就慢,编译型的就快。一般人都把python看成解释型的,于是就得出它运行速度慢的结论。不少人都因此上当受骗了,认为python不值得学,或者做不了什么“大事”。这就是将本来复杂的多样化的世界非得划分为“黑白”的结果。这种喜欢用“非此即彼”的思维方式考虑问题的现象可以说在现在很常见,比如一提到“日本人”,除了苍老师,都该杀,这基本上是小孩子的思维方法,可惜在某个过度内大行其道
64+
不少人喜欢将这个世界简化简化再简化。比如人,就分为好人还坏人,比如编程语言就分为解释型和编译型,不但如此,还将两种类型的语言分别贴上运行效率高低的标签,解释型的运行速度就慢,编译型的就快。一般人都把Python看成解释型的,于是就得出它运行速度慢的结论。不少人都因此上当受骗了,认为Python不值得学,或者做不了什么“大事”。这就是将本来复杂的多样化的世界非得划分为“黑白”的结果。这种喜欢用“非此即彼”的思维方式考虑问题的现象可以说在现在很常见,比如一提到“日本人”,除了苍老师,都该杀,这基本上是小孩子的思维方法,可惜在某国大行其道
6365

64-
世界是复杂的,“敌人的敌人就是朋友”是幼稚的,“一分为二”是机械的。当然,苍老师是德艺双馨的。
66+
世界是复杂的,“敌人的敌人就是朋友”是幼稚的,“一分为二”是机械的。当然,苍老师是德艺双馨的,无可辩驳、毋庸置疑
6567

66-
就如同刚才看到的那个.pyc文件一样,当python解释器读取了.py文件,先将它变成由字节码组成的.pyc文件,然后这个.pyc文件交给一个叫做python虚拟机的东西去运行(那些号称编译型的语言也是这个流程,不同的是它们先有一个明显的编译过程,编译好了之后再运行)。如果.py文件修改了,python解释器会重新编译,只是这个编译过程不是完全显示给你看的。
68+
就如同刚才看到的那个.pyc文件一样,当Python解释器读取了.py文件,先将它变成由字节码组成的.pyc文件,然后这个.pyc文件交给一个叫做Python虚拟机的东西去运行(那些号称编译型的语言也是这个流程,不同的是它们先有一个明显的编译过程,编译好了之后再运行)。如果.py文件修改了,Python解释器会重新编译,只是这个编译过程不是完全显示给你看的。
6769

68-
我这里说的比较笼统,要深入了解python程序的执行过程,可以阅读这篇文章:[说说Python程序的执行过程](http://www.cnblogs.com/kym/archive/2012/05/14/2498728.html)
70+
我这里说的比较笼统,要深入了解Python程序的执行过程,可以阅读这篇文章:[说说Python程序的执行过程](http://www.cnblogs.com/kym/archive/2012/05/14/2498728.html)
6971

70-
总之,有了.pyc文件后,每次运行,就不需要从新让解释器来编译.py文件了,除非.py文件修改了。这样,python运行的就是那个编译好了的.pyc文件。
72+
总之,有了.pyc文件后,每次运行,就不需要从新让解释器来编译.py文件了,除非.py文件修改了。这样,Python运行的就是那个编译好了的.pyc文件。
7173

7274
是否还记得,我们在前面写有关程序,然后执行,常常要用到`if __name__ == "__main__"`。那时我们写的.py文件是来执行的,这时我们同样写了.py文件,是作为模块引入的。这就得深入探究一下,同样是.py文件,它是怎么知道是被当做程序执行还是被当做模块引入?
7375

@@ -115,7 +117,7 @@ python不是一个封闭的体系,是一个开放系统。开放系统的最
115117

116118
##模块的位置
117119

118-
为了让我们自己写的模块能够被python解释器知道,需要用`sys.path.append("~/Documents/VBS/StarterLearningPython/2code/pm.py")`。其实,在python中,所有模块都被加入到了sys.path里面了。用下面的方法可以看到模块所在位置:
120+
为了让我们自己写的模块能够被Python解释器知道,需要用`sys.path.append("~/Documents/VBS/StarterLearningPython/2code/pm.py")`。其实,在Python中,所有模块都被加入到了sys.path里面了。用下面的方法可以看到模块所在位置:
119121

120122
>>> import sys
121123
>>> import pprint
@@ -155,13 +157,13 @@ python不是一个封闭的体系,是一个开放系统。开放系统的最
155157

156158
##PYTHONPATH环境变量
157159

158-
将模块文件放到指定位置是一种不错的方法。当程序员都喜欢自由,能不能放到别处呢?当然能,用`sys.path.append()`就是不管把文件放哪里,都可以把其位置告诉python解释器。但是,这种方法不是很常用。因为它也有麻烦的地方,比如在交互模式下,如果关闭了,然后再开启,还得从新告知。
160+
将模块文件放到指定位置是一种不错的方法。当程序员都喜欢自由,能不能放到别处呢?当然能,用`sys.path.append()`就是不管把文件放哪里,都可以把其位置告诉Python解释器。但是,这种方法不是很常用。因为它也有麻烦的地方,比如在交互模式下,如果关闭了,然后再开启,还得从新告知。
159161

160162
比较常用的告知方法是设置PYTHONPATH环境变量。
161163

162164
>环境变量,不同操作系统的设置方法略有差异。读者可以根据自己的操作系统,到网上搜索设置方法。
163165
164-
我以ubuntu为例,建立一个python的目录,然后将我自己写的.py文件放到这里,并设置环境变量。
166+
我以Ubuntu为例,建立一个Python的目录,然后将我自己写的.py文件放到这里,并设置环境变量。
165167

166168
:~$ mkdir python
167169
:~$ cd python
@@ -186,6 +188,12 @@ python不是一个封闭的体系,是一个开放系统。开放系统的最
186188

187189
如此,就完成了告知过程。
188190

191+
##模块中的'__all__'
192+
193+
上面的模块虽然比较简单,但是已经显示了编写模块和在程序中导入模块的基本方式。在实践中,所编写的模块也许更复杂一点,比如,我写了这么一个模块,并把其文件命名为21901.py
194+
http://python.jobbole.com/81187/
195+
196+
189197
##`__init__.py`方法
190198

191199
`__init__.py`是一个空文件,将它放在某个目录中,就可以将该目录中的其它.py文件作为模块被引用。这个具体应用参见[用tornado做网站(2)](./304.md)

2code/21901.py

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
# /usr/bin/env python
2+
# coding:utf-8
3+
4+
public_variable = "Hello, I am a public variable."
5+
_private_variable = "Hi, I am a private variable."
6+
7+
def public_teacher():
8+
print "I am a public teacher, I am from JP."
9+
10+
def _private_teacher():
11+
print "I am a private teacher, I am from CN."

0 commit comments

Comments
 (0)