Pythonでオブジェクト指向を使わないメリット
Pythonはオブジェクト指向を強制しない言語であり、関数型やプロシージャル型のスタイルでコーディングが可能です。特に小規模なスクリプトや基本的な処理では、クラスを定義せずに関数だけで対応できる場合がある為、コードが短くなり初心者にも理解しやすくなります。
関数を中心としたプログラミングスタイルではデータと操作を分離できる為、各関数ははっきりした入力と出力を持ち副作用を抑えやすくなります。また、関数型プログラミングの考え方を取り入れると、動作が安定しやすくなります。
【サンプルコード】
def add(a, b):
return a + b
def subtract(a, b):
return a - b
def multiply(a, b):
return a * b
def divide(a, b):
if b == 0:
return "ゼロ除算エラー"
return a / b
num1 = 10
num2 = 5
print(f"足し算: {add(num1, num2)}")
print(f"引き算: {subtract(num1, num2)}")
print(f"掛け算: {multiply(num1, num2)}")
print(f"割り算: {divide(num1, num2)}")
【実行結果】
足し算: 15
引き算: 5
掛け算: 50
割り算: 2.0
上記のコードでは、各演算を独立した関数として定義しています。これらの関数は引数を受け取り計算結果を返すだけの構造なので、クラスを使用しない結果コード量が減り読みやすさに配慮できます。
詳細説明 | |
---|---|
1行目 | add関数を定義し引数aとbを受け取る |
2行目 | aとbを加算した結果を返す |
3行目 | subtract関数を定義し引数aとbを受け取る |
4行目 | aからbを引いた結果を返す |
5行目 | multiply関数を定義し引数aとbを受け取る |
6行目 | aとbを掛け算した結果を返す |
7行目 | divide関数を定義し引数aとbを受け取る |
8行目 | もしbが0なら文字列を返す |
9行目 | aをbで割った結果を返す |
10行目 | 変数num1に10を代入 |
11行目 | 変数num2に5を代入 |
12行目 | add関数の結果を表示 |
13行目 | subtract関数の結果を表示 |
14行目 | multiply関数の結果を表示 |
15行目 | divide関数の結果を表示 |
【PR】『Python』を学べる企業・個人向けのプログラミングコース
辞書と関数を組み合わせたオブジェクト指向を使わない設計
Pythonでオブジェクト指向を使わない方法として、辞書とクロージャを組み合わせる方法があります。辞書はデータ構造として扱いやすく、関数と合わせるとクラスに似た動きをできます。この考え方は「データとその操作」を分離することを重視します。
クロージャを使うことで関数が自身の状態を保持することが可能になり、これはオブジェクト指向の「インスタンス変数」に相当する機能です。また、高階関数を使用することによって、関数を返す関数を作成できます。これはファクトリ関数のパターンに似ており、オブジェクト生成に代わる手段となります。
【実行結果】
def create_account(owner, initial_balance=0):
account_data = {
'owner': owner,
'balance': initial_balance,
'transactions': []
}
def deposit(amount):
if amount <= 0:
return "入金額は正の数である必要があります"
account_data['balance'] += amount
account_data['transactions'].append(f"入金: {amount}")
return f"{amount}円を入金しました。残高: {account_data['balance']}円"
def withdraw(amount):
if amount <= 0:
return "出金額は正の数である必要があります"
if amount > account_data['balance']:
return "残高不足です"
account_data['balance'] -= amount
account_data['transactions'].append(f"出金: {amount}")
return f"{amount}円を出金しました。残高: {account_data['balance']}円"
def get_balance():
return f"現在の残高: {account_data['balance']}円"
def get_transaction_history():
return account_data['transactions']
return {
'deposit': deposit,
'withdraw': withdraw,
'get_balance': get_balance,
'get_transaction_history': get_transaction_history,
'owner': account_data['owner']
}
account = create_account("山田太郎", 10000)
print(f"口座所有者: {account['owner']}")
print(account['get_balance']())
print(account['deposit'](5000))
print(account['withdraw'](2000))
print(account['get_balance']())
print("取引履歴:")
for transaction in account['get_transaction_history']():
print(f"- {transaction}")
【実行結果】
口座所有者: 山田太郎
現在の残高: 10000円
5000円を入金しました。残高: 15000円
2000円を出金しました。残高: 13000円
現在の残高: 13000円
取引履歴:
- 入金: 5000
- 出金: 2000
上記のサンプルコードでは、クラスの代わりに関数と辞書を使って簡易的な銀行口座システムを作成しています。create_account
関数はクロージャでアカウントのデータを保持しながら操作用の関数を返し、戻り値の辞書はクラスのメソッドに似た形で各操作へアクセスできます。このような方法でもデータのカプセル化や操作の集約といった仕組みを部分的に再現することが可能です。
詳細説明 | |
---|---|
1行目 | create_account関数を定義し口座所有者と初期残高を受け取る |
2行目 | ownerやbalanceを含む辞書account_dataを作成 |
3行目 | deposit関数を定義し入金処理を行う |
4行目 | amountが0以下ならメッセージを返す |
5行目 | 残高を更新し取引履歴に追加する |
6行目 | withdraw関数を定義し出金処理を行う |
7行目 | amountが0以下ならメッセージを返す |
8行目 | amountが残高を超える場合はエラーメッセージを返す |
9行目 | 残高を更新し取引履歴に追加する |
10行目 | get_balance関数を定義し残高を取得する |
11行目 | 残高を文字列として返す |
12行目 | get_transaction_history関数を定義し取引履歴のリストを返す |
13行目 | create_account関数の戻り値として操作用の関数群を辞書で返す |
14行目 | 新規口座を作成しaccountに代入 |
15行目 | ownerキーの値を表示 |
16行目 | get_balance関数の実行結果を表示 |
17行目 | deposit関数を呼び出して入金し結果を表示 |
18行目 | withdraw関数を呼び出して出金し結果を表示 |
19行目 | 再度get_balance関数を実行し残高を表示 |
20行目 | 取引履歴を表示するためのメッセージを表示 |
21行目 | get_transaction_history関数を呼び出して履歴の各要素をループ |
22行目 | 取引内容をprint関数で表示 |
※上記コンテンツの内容やソースコードはAIで確認・デバッグしておりますが、間違いやエラー、脆弱性などがある場合は、コメントよりご報告いただけますと幸いです。
ITやプログラミングに関するコラム
- 【Python】@(アットマーク)の意味を簡単に解説
- 【Python】match case(match文)で複数条件を処理する方法
- 【Python】リスト(list)内包表記におけるifやif elseなどの使い分け
- 【Python】venvのバージョン(version)指定や確認方法