Python模块导入与__name__变量的使用

    我有以下三个python文件:

Python模块导入与__name__变量的使用_第1张图片

在python中每一个py文件都是一个模块,不管里面写了什么。

现在main.py调用test1模块,那么导入的方式可以是:

  1. import test1导入test1包,在使用其中的类或者方法时,需要指定,如:test1.test()
  2. from test1 import *  导入test1模块所有的内容,在main中可以直接test()
  3. from test1 import test 只导入test1模块中的test方法或者类
  4. import test1 as tt 表示test1的别名,在main中使用时不能test1.test(),而是tt.test()
  5. from test1 import test,test1 导入多个方法

test1和main两个文件的内容分别是:

test1.py

def test():
        print('this is test1 test')

def test1():
        print('this is test1 test1')
test()

main.py

import test1

test1.test()

此时执行main.py


这样就导入了test1.py模块了。

假如我为了在test1.py中测试test函数,代码如下:

def test():
        print('this is test1 test')

def test1():
        print('this is test1 test1')
test()

再去执行main.py,看到结果:


出现了两条打印记录,换句话说就是test函数被执行了两次,这里的原因是当一个模块被导入时,实际上是执行了这个模块一次:

Python模块导入与__name__变量的使用_第2张图片

那么为了测试如何避免这种情况,在执行main时只打印一条数据呢,此时就用到"__name__"这个特殊变量了。

这个变量在本文件中值为“__main__”,如果被导入到别的模块中时,那么这个值就变成了这个模块的名字了,如:

def test():
        print('this is test1 test')

def test1():
        print('this is test1 test1')

test()
print('__name__ : %s'%(__name__))

输出为:


此时再执行main,py


显而易见,值已经不一样了,那么通过这个特性只要修改test1.py如下代码就可以:

def test():
        print('this is test1 test')

def test1():
        print('this is test1 test1')

if __name__ == '__main__':
        test()

再次执行main.py:


问题就解决了。

需要注意的是当导入方式为“*”时,如果存在同名的函数或者方法,那么最后一个导入的会覆盖前面的,test2.py也有函数

test,

def test():
        print('this is test2 test')

main.py修改如下:

from test1 import *
from test2 import *

test()

执行如下:


所以需要注意。




你可能感兴趣的:(Python)