在python中,假设在一个test1.py的模块中定义了一个foo函数,而后调用函数foo进行测试的时候会产生一个内存空间。当你把这个模块导入到test2.py模块中,接下来若是在test2.py模块中执行某一段代码的时,就会自动执行test1.py模块中的foo函数。这样会致使什么问题呢?会致使你本来只想测试当前的代码,又自动执行了另外一个模块中的函数。python
那如何解决这个问题:函数
test1.py # 定义foo函数 def foo(): print('from foo...') foo() # from foo...
test2.py from test_1 import test1 # 在test2.py模块中打印test1.py模块中的__name__属性发生了变化 print(test1.__name__) # test_1.test1 def bar(): print('from bar...') bar() # 此时会在当前文件中执行bar函数会自动执行test1模块中的foo函数 ''' from foo... from bar... '''
由于在python中一切皆对象,其实模块也是一个对象,那么每个模块中都包含着一个__name__属性,而这个属性会根据模块所在的位置而发生变化。咱们能够经过对__name__这个属性进行判断。从而解决由于导入其余模块自动执行的问题。测试
一、test1.py模块中打印__name__属性。spa
test1.py # 定义foo函数 def foo(): print('from foo...') # 在当前文件中的__name__属性值 print(__name__) # __main__ foo() # from foo...
二、在test2.py模块中执行bar函数code
test2.py from test_1 import test1 # 在test2.py模块中打印test1.py模块中的__name__属性发生了变化 print(test1.__name__) # test_1.test1 def bar(): print('from bar...') bar() # 此时会在当前文件中执行bar函数会自动执行test1模块中的foo函数 ''' from foo... from bar... '''
三、在test1.py中添加if __name__ == '__main__'判断对象
由上述可见,test1.py模块中的__name__会根据执行文件的位置发生变化,由此咱们能够经过对__name__属性进行判断调用者是否在当前模块调用函数进行测试。若是不是当前文件执行,就不会执行调用的函数。blog
test1.py # 定义foo函数 def foo(): print('from foo...') # 在当前文件中的__name__属性值 print(__name__) # __main__ if __name__ == '__main__': # __name__: test_1.test1 foo()
test2.py from test_1 import test1 print(test1.__name__) # test_1.test1 def bar(): print('from bar...') bar() # from bar...
这就是为什么在python中要使用if __name__ == ‘__main__’进行对函数功能的测试了!内存