# 模組 Module 我們之前用過像 `random` 的模組,他就像工具箱一樣,裡面有很多工具可以讓你使用。我們也可以創造一個模組給自己用。 前置作業: - 新增一個資料夾。 - 在資料夾中新增 `m1.py` - 在資料夾中新增 `main.py` 我們先超~簡單的在 `m1.py` 新增一個函數,並且在 `main.py` 中使用。 ```python= # m1.py def hello(): print('Hello from module m1.') ``` ```python= # main.py import m1 m1.hello() # Hello from module m1. ``` 恭喜你會使用自創模組了!我們下次見,欸不是! 我們來做一個實驗,在 `m1.py` 裡面新增別的東西。 ```python= # m1.py def hello(): print('Hello from module m1.') print('Hi I am module m1!') ``` 現在你再執行一次 `main.py` ,你會發現就算你不執行 `m1.hello()`,也會出現 `Hi I am module m1!`這句話。 也許你單獨執行 `m1.py` 的時候會用到某個東西,希望他自動執行。但是在「使用」這個模組時,不希望他出現。這時候你可以這麼做: ```python= # m1.py def hello(): print('Hello from module m1.') if __name__ == '__main__': print('Hi I am module m1!') ``` 若你執行 `m1.py` 會出現這句話;執行 `main.py` 則不會! `__name__` 這個參數,當你直接執行這個檔案(例如直接執行`m1.py`)時,他會是 `__main__`,也就是你把它當作主程式執行。 若你執行 `main.py` ,那此時 `m1.py` 的 `__name__` 會變成 `m1`,也就是這個檔案的名稱。原因是此時他就變成一個模組供你使用。那他就不會執行 `if`裡面的東西。 為什麼要這麼做呢?因為你可以當~~工具人~~模組,也可以當主程式。因此每個`.py`都可以這樣寫。 我們再把兩個檔案進行改寫一下: ```python= # m1.py def hello(): print('Hello from module m1.') def main(): print('Hi I am module m1!') if __name__ == '__main__': main() ``` ```python= # main.py import m1 def main(): m1.hello() if __name__ == '__main__': main() ``` 恩?你說為什麼要改成定義 `main()` 嗎?我想到再告訴你xD ## import 變數 我們可以 `from A import *`,那麼就會import 所有東西, 但有機會造成變數名稱衝突! 這時候我們可以在被import 的模組做一些事: 法1:用底線開頭,建立 `private`變數。 ```python= # some_module.py pi = 3.14159 _somePrivateInteger = 30 ``` 法2:定義`__all__`,告訴有那些會被 import ```python= __all__ = ['pi', ] pi = 3.14159 e = 2.718 ``` ## dir() 用`dir()`看看現在有哪些東西