---
# System prepended metadata

title: 模組 Module

---

# 模組 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()`看看現在有哪些東西