module第二讲

首先在一个目录test下面创建两个python程序:use_name_1.py 和 use_name_2.py。(test目录下有且只有两个文件)

#-----------(1)——-----------------

#! /usr/bin/env python
#coding=utf-8
'''
Filename:
use_name_1.py
'''
print 'the _name_ of this program is: ', __name__

if __name__=='__main__':
    print 'this is the moduleself is runing!'
else:
    print 'this is the module is being imported!'

#-------(2)------------------------

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

'''
Filename:
use_name_2.py
'''

import use_name_1
import use_name_1
import use_name_1
import use_name_1
import use_name_1

#------------------------------------

执行过程分析:

首先执行use_name_1.py,输出结果为:

the __name__ of this program is: __main__

this is the moduleself is runing!

这说明: use_name_1.py中出现了一个变量 __name__,这个变量并不是写程序的人定义的,但它的的确确在那里!

观察目录,发现 test目录下:依然有且只有原先的两个文件use_name_1.py 和 use_name_2.py。

 

接着执行use_name_2.py,发现输出结果为:

the _name_ of this program is: use_name_1

this is the module is being imported!

观察目录,发现 test目录下:除了原先的两个文件use_name_1.py 和 use_name_2.py以外,还多出了一个文件use_name_1.pyc。

这说明:

(1)当程序import use_name_2中导入模块import use_name_1以后,模块 use_name_1的主块被执行了,但只执行了一次,以后无论导入多少次,模块的主块都不在执行

(2)模块1执行时,他的__name__的值改变了,原先的值是 '__main__',现在变为'use_name_1'

看到这儿就理解了:

原来__name__这个变量是个不须定义的变量,在本模块被执行时,他的值等于 '__main__';而当它所在的模块被调用的时候,他的值等于所在模块的模块名(不带py后缀)

它的用途:

     我们假设一种情形,程序员希望模块use_name_1.py中的函数和变量可以被别人调用,但是主块中的 print 'this is the moduleself is runing!' 不要执行,这时候可以用_name__这个变量来进行开关。

 

那么那个.pyc文件是怎么回事呢?原来那个文件叫做字节编译pyc文件。当模块被被别人导入时,相当费时费力;为了应对这个问题,为了被别人第二次导入的时候快一些,python采取了字节编译方式,第二次导入的时候实际上导入的是use_name_1.pyc,而不是原来的use_name_1.py。你不信,不信你删掉原先的use_name_1.py,保留use_name_1.pyc,再运行use_name_2.py,程序依然过了,呵呵python果然注重应用,除了问题,就想办法解决问题。

最后说说自己的理解:导入一个模块,那被导入模块的主块就执行了。python采取了三种策略:第一种策略是一次导入,主块被执行,再次导入主块不被执行;第二种策略是一次导入就形成字节编译pyc文件,再次导入时只导入pyc文件,pyc比py跑得快;第三种策略是__name__开关,利用

if __name__=='__main__':

       执行use_name_1的任务。

 

 

 

 

 

posted @ 2013-04-30 17:50  唧唧歪歪sss  阅读(231)  评论(0编辑  收藏  举报