【Python】オブジェクト指向を使わないで設計する方法

【Python】オブジェクト指向を使わないで設計する方法

公開: 更新:



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やプログラミングに関するコラム


ITやプログラミングに関するニュース

ブログに戻る

コメントを残す

コメントは公開前に承認される必要があることにご注意ください。

コードキャンプDX人材育成研修 - IT・プログラミングを知って学べるコネクトメディア 金融業界の業務効率化を加速するニッセイアセットマネジメントの生成AI×GAS活用研修事例 - IT・プログラミングを知って学べるコネクトメディア 【製造業のDX人材育成事例】デジタル人材の即戦力化を実現する、日本ガイシ株式会社の異動者向オンボーディング研修 - ITやプログラミングを知って学べるコネクトメディア フューチャーアーキテクト株式会社が実現した新入社員向けIT研修プログラムでタスクフォース制度が主体的な学びと成長を生み出す - IT・プログラミングを知って学べるコネクトメディア コードキャンプDX人材育成研修 - IT・プログラミングを知って学べるコネクトメディア コードキャンプIT・プログラミング研修事例/【IT新入社員研修】オンラインとオフラインの最適バランスを実現したFutureOneの導入事例 - IT・プログラミングを知って学べるコネクトメディア コードキャンプIT・プログラミング研修事例/【新入社員研修】柔軟なハイブリッド型Java研修で実現した新卒20名の成長と成果|サークレイス株式会社 - ITやプログラミングを知って学べるコネクトメディア コードキャンプIT・プログラミング研修事例/現場により近いところにデジタルを根付かせるDX基礎講座研修|株式会社ブリヂストン - ITやプログラミングを知って学べるコネクトメディア コードキャンプIT・プログラミング研修事例/業務の効率化・DX推進に向けたIT人材育成への第一歩|株式会社カナエ - ITやプログラミングを知って学べるコネクトメディア 企業・法人向けのIT・プログラミング研修 - ITやプログラミングを知って学べるコネクトメディア

新着記事

対象者別で探す

子供(小学生・中学生・高校生)向け
プログラミング教室検索する

子供(小学生・中学生・高校生)がロボットやプログラミング言語を学ぶことができるオフラインからオンラインスクールを検索、比較することが可能です。

子供(小学生・中学生・高校生)
プログラミング教室検索する

ITやプログラムなどの
最新情報を検索する

日々、新しいITやプログラミング言語の情報が流れていきますが、特定の情報を時系列でニュースやコラムを確認することができます。

ITやプログラムなどの
最新情報を検索する