-
1 # 留德華叫獸
-
2 # 程式設計字典
的作用
當Python直譯器讀取原始檔時,它會執行其中的所有程式碼。
在執行程式碼之前,它將定義一些特殊變數。例如,如果Python直譯器將該模組(原始檔)作為主程式執行,則它將特殊變數設定為具有值。如果從另一個模組匯入此檔案,則將其設定為模組的名稱。
例項
import time, threaddef myfunction(string, sleeptime, lock, *args): while True: lock.acquire() t...教程:Python專題:http://codingdict.com/article/22037 -
3 # Bean蠶豆
if __name__ == "__main__",意思是當該檔案被直接執行(run)時,該語句後面的程式碼被執行;當該檔案被其它檔案以模組的形式存在被引用時,該語句後面的程式碼不被執行。
__name__是內建變數,表示當前模組的名字。
比如,我們有下面這樣一個檔案該檔案中有一個函式,用於計算兩個時間之間相隔多少秒。如果我們寫了一行
if __name__ == "__main__"這樣的話,我們在引用該py檔案的時候,下面的total_seconds(afteer - before)的計算就不會被執行。如果我們此時,換成不帶__name__型別這種方式的話就會,函式的結果就會被執行出來。
-
4 # 網際網路麵霸
要理解if __name__ == "main",首先要理解一下python的變數命名規則:
1.普通變數:小寫字母,單詞之間用_分割 比如:a, score, user_info
2.單下劃線開頭: 表示該變數是一個受保護(protected)的變數,原則上不允許直接訪問,但外部類還是可以訪問到這個變數。這只是程式設計師之間的一個約定,用於警告說明這是一個私有變數,外部類不要去訪問它。例如:_name
3.雙下劃線開頭:表示的是私有型別(private)的變數
只能是允許這個類本身進行訪問了, 連子類也不可以.用於命名一個類屬性(類變數),呼叫時名字被改變(在類User內部,__name變成_User__name,如 self._User__name)雙下劃線開頭的例項變數是不是一定不能從外部訪問呢?其實也不是.仍然可以透過 _User__name來訪問__name變數:示例
class User:
def __init__(self, name):
self.__name=name
user=User("test")
print(user._User__name)
4.單下劃線結尾:變數名跟關鍵詞衝突時,可以加單下劃線區分。例如:type_
5.以雙下劃線開頭,並且以雙下劃線結尾的,是內建變數.
內建變數是可以直接訪問的,不是 private 變數,如__init__,__name__因此可知__name__ 是一個內建變數,但是那個物件的內建變數呢?就是該模組的內建變數,模組是物件,並且每個模組都有一個內建屬性__name__瞭解了__name__ 的含義,接下來我們看一下__name__ 的取值
在python中,如果當前模組當做一個指令碼執行時(不透過import方式執行),
moduel.__name__的值將是"__main__";
而當一個模組被其它模組引用時,module.__name__將是module自己的名字(可以理解為"if __name__=="__main__":" 即作為入口;)
示例:
vi test_module.py
def main():
print("__name__ is :", __name__)
if __name__ == "__main__":
main()
如果直接python test_module.py
輸出:__name__ is : __main__
如果import 的方式調
輸出:__name__ is : test_module
回覆列表
對於很多程式語言來說,程式都必須要有一個入口,比如 C,C++,以及完全面向物件的程式語言 Java,C# 等。如果你接觸過這些語言,對於程式入口這個概念應該很好理解,C 和 C++ 都需要有一個 main 函式來作為程式的入口,也就是程式的執行會從 main 函式開始。同樣,Java 和 C# 必須要有一個包含 Main 方法的主類來作為程式入口。而 Python 則有不同,它屬於指令碼語言,不像編譯型語言那樣先將程式編譯成二進位制再執行,而是動態的逐行解釋執行。也就是從指令碼第一行開始執行,沒有統一的入口。
一段好的示例程式碼勝過一切
這裡有倆個程式
const.py用來定義常數PI
area.py需要PI這個常數來計算圓的面積
const.py 程式碼如下:
PI = 3.14def main():print "PI:", PImain()當執行python const.py,輸出
PI: 3.14area.py (匯入PI的值來計算圓面積)程式碼如下
from const import PIdef calc_round_area(radius):return PI * (radius ** 2)def main():print "round area: ", calc_round_area(2)main()當執行python area.py,因為匯入了const,輸出
PI: 3.14round area: 12.56可以看到
const.py裡面的main()也被執行了
但這是我們所不希望的
怎麼辦?
只需在const.py中加入一句:
PI = 3.14def main():print "PI:", PIif __name__ == "__main__":main()_name_代表當前模組的名字
當我們再次執行“python area.py”時
對於const.py來說
_name_不再是_main_
因此其中的main()不再被執行
最終得到我們想要的輸出
round area: 12.56以上示例程式碼及註釋部分取自博文(非常好的總結文章,還詳細解釋了_name_):
https://dwz.cn/20WehPTe