package 套件

點選專案名稱,滑鼠右鍵,New -> Python Package
img

自己取package名字。
img

會產生一個 __init__.py 檔案。
img

在我自建的package下,建立一個module1.py檔案,內容如下:

module1.py:

1
2
3
4
5
6
7
8
9
10
11
def add(x, y):
    return x + y

def minus(x, y):
    return x - y

def div(x, y):
    return x / y

def mul(x, y):
    return x * y

新增一個module2.py檔案,內容如下:

1
2
3
4
5
def hi():
    print("hi")
    
def hello():
    print("hello")

import 套件.模組

在my_package之外,建立一個test1.py,用到呼叫套件中模組的函式。

目錄結構如下:

專案
|-- my_package
|     |- module1.py
|     |- module2.py
|-- test1.py

語法:

import 套件.模組
# 呼叫函式
套件.模組.函式()

以下程式碼是test1.py 呼叫套件中的模組函式。
麻煩的是,呼叫函式的時候,套件也要有。

test1.py

1
2
3
4
# import 套件 與 模組
import my_package.module1
# 呼叫函式
print(my_package.module1.add(1, 2))
3

from 套件 import 模組

語法:

from 套件 import 模組
# 呼叫函式
模組.函式()

呼叫模組函式時,不用有套件名。

test1.py

1
2
from my_package import module1
print(module1.add(1, 2))

from 套件.模組 import 函式

語法:

from 套件.模組 import 函式
# 呼叫函式
函式()

以下用 * 星號取代函式,代表所有函式都會被import進來。

1
2
from my_package.module1 import *
print(add(1, 2))

from 套件 import *

__init__.py 中,增加 __all__ 可以限制那些模組可以使用。

1
__all__ = ["module1", "module2"]

使用星號 * 匯入所有模組。

1
2
3
4
from my_package import *

module2.hi()
print(module1.add(5, 10))
hi
15

若模組沒加到 __all__ 中,使用星號 * 時,無法使用。
__init__.py __all__ 去除 module1

1
__all__ = ["module2"]

再次執行以下程式碼,module1就會有錯誤。

1
2
3
4
from my_package import *

module2.hi()
print(module1.add(5, 10))

以上僅對from 套件 import * 有效。
from 套件 import 模組,就不會受到 __init__.py __all__ 影嚮。

以下程式碼,使用from my_package import module1,即便 __all__ 只有 module2 可以對外呼叫,但仍是可以使用 module1。

test1.py

1
2
3
4
5
from my_package import module1
from my_package import module2

module2.hi()
print(module1.add(5, 10))
hi
15

套件中有套件

套件中可以有子套件。
下圖中,my_package2套件下面有child_package1套件。
img

呼叫方式有以下二種。
方法1:

form 套件.套件.模組 import 函式
函式()

方法2:

from 套件.套件 import 模組
模組.函式()

results matching ""

    No results matching ""