这里对于执行顺序一定要注意,大多数地方对于main()的执行都是说,这里更多的适用于测试,如果模块被调用,因为此时的__name__为模块的名字,则不会这行,如果作为一个单独的“程序”则执行,总结如下。
对于 if __name__ == '__main__': 的解释相关博客已经给出了说明,意思就是
1、当此文件当做模块被调用时,不会从这里执行,因为此时name属性就成了模块的名字,而不是main。 当此文件当做单独执行的程序运行时,就会从main开始执行。但是发现,前边有类的声明的时候,函数时如何执行的?
2 、对于带有类的程序,会先执行类及类内函数,或者其他类外函数。这里可以总结为,对于没有缩进的程序段,按照顺序执行。然后,才到main函数。然后才按照main内函数的执行顺序执行。如果main内对类进行了实例化,那么执行到此处时,只会对类内成员进行初始化,然后再返回到main 函数中。 执行其他实例化之后对象的成员函数调用。
对于1用一个实例进行解读,定义一个mathfunc.py:
'''mathfunc.py-function defination'''
def add(a, b):
return a+b
print "mathfunc:1+3 = ",(1+3)
if __name__ == "__main__":
print "mathfunc:add(a,b) = ",add(12,5)
运行并输出:
现在调用模块 mathfunc.py 的test_mathfunc.py的模块
# -*- coding: utf-8 -*-
import unittest
from mathfunc import *
print "test_mathfunc:a(3)+b(4)= ",(3+4)
class TestMathFunc(unittest.TestCase):
"""Test mathfuc.py"""
@classmethod
def setUp(cls):
print "test_mathfunc:setUp"
print "do something before test.Prepare environment."
@classmethod
def tearDown(cls):
print "do something after test.Clean up."
def test_add(self):
"""Test method add(a, b)"""
print "test_mathfunc:test_add"
self.assertEqual(3, add(1, 2))
self.assertNotEqual(3, add(2, 2))
print "test_mathfunc:a(5)+b(6)= ",(5+6)
print
class Test():
'''Test the order of procedure'''
def __init__(self):
pass
def add(self,a,b):
return ( a + b )
if __name__ == "__main__":
test = Test()
print "test_mathfunc:",test.add(7,8)
不同于c/c++有统一的程序入口函数main(),而Python则不同,它属于脚本语言,不像编译型语言那样先将程序编译成二进制再运行,而是动态的逐行解释运行。也就是从脚本第一行开始运行,没有统一的入口。
一个Python源码文件(.py)除了可以被直接运行外,还可以作为模块(也就是库),被其他.py文件导入。不管是直接运行还是被导入,.py文件的最顶层代码都会被运行(Python用缩进来区分代码层次),而当一个.py文件作为模块被导入时,我们可能不希望一部分代码被运行。
因为Python是解释型的语言,按照“顺序”执行,执行顺序依次是导入模块(import mathfunc)中的未缩进的程序段,这里即是 mathfunc.py中的print语句,接着是本模块中未缩进的程序段,接着是派生的unittest.Testcase类