python中__name == '__main__'
這里對于執行順序一定要注意,大多數地方對于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"""@classmethoddef setUp(cls):print "test_mathfunc:setUp"print "do something before test.Prepare environment."@classmethoddef 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) printclass Test():'''Test the order of procedure'''def __init__(self):passdef 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類
總結
以上是生活随笔為你收集整理的python中__name == '__main__'的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 自动化测试框架搭建-报告-4
- 下一篇: selenium2与python自动化1