Python – Module & __name__

測試環境為 CentOS 8 x86_64 (虛擬機)

Module 模組的使用.

[root@localhost ~]# vi mod1.py
def multi(n,m):
 return n*m
def add(n,m):
 return n+m
def sub(n,m):
 return n-m

要使用剛剛定義好的 Module 模組只需要透過 import modeule 名稱,即可使用.使用時 模組名稱.函數名稱

[root@localhost ~]# vi mod_test1.py
import mod1
print(mod1.multi(2,3))
print(mod1.add(2,3))
print(mod1.sub(2,3))

執行結果.

[root@localhost ~]# python3 mod_test1.py
6
5
-1

__name__

關於 object.__name__ 說明 : https://docs.python.org/3/library/stdtypes.html?#definition.__name__
The name of the class, function, method, descriptor, or generator instance.

通常會直接在 Module 裡面就會測試一下函數的功能.

[root@localhost ~]# vi mod1.py
def multi(n,m):
 return n*m
def add(n,m):
 return n+m
def sub(n,m):
 return n-m

print(multi(2,3))
print(add(2,3))
print(sub(2,3))

執行結果.

[root@localhost ~]# python3 mod1.py
6
5
-1

但這樣會出現匯入時就順便執行程式了

[root@localhost ~]# python3 mod_test1.py
6
5
-1
6
5
-1

這時候可以透過 __name__ 的值判斷檔案被直接執行或是被引用的.

  • 直接執行其 __name__ 的值為 __main__
    [root@localhost ~]# vi mod2.py
    print('__name__:' + __name__)
    

    執行結果.

    [root@localhost ~]# python3 mod2.py
    __name__:__main__
    
  • 被引用其 __name__ 的值為 mod2(模組名稱)
    [root@localhost ~]# vi mod_test2.py
    import mod2
    

    執行結果.

    [root@localhost ~]# python3 mod_test2.py
    __name__:mod2
    

所以前面 Module 的 範例 mod1.py 使用 if __name__ == ‘__main__’: 來確保只有在直接執行時才執行.

[root@localhost ~]# vi mod1.py
def multi(n,m):
 return n*m
def add(n,m):
 return n+m
def sub(n,m):
 return n-m

if __name__ == '__main__':
    print(multi(2,3))
if __name__ == '__main__':
    print(add(2,3))
if __name__ == '__main__':
    print(sub(2,3))

執行結果.

[root@localhost ~]# python3 mod1.py
6
5
-1
[root@localhost ~]# python3 mod_test1.py
6
5
-1

可以看到當 mod_test1.py 引用 mod1.py 時不會去執行測試用程式碼.

沒有解決問題,試試搜尋本站其他內容

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *

這個網站採用 Akismet 服務減少垃圾留言。進一步了解 Akismet 如何處理網站訪客的留言資料