Python転職初心者向けエンジニアリングブログ

Pythonに魅了されたあなたへ。エンジニアリングの扉を開く転職初心者向けのブログへようこそ。このブログでは、Pythonの奥深さに迫りながら、エンジニアリングへの転職に役立つ情報を提供しています。未経験者から始めるPythonエンジニアリングの世界への一歩を踏み出すためのガイダンス、ベストプラクティス、そして成功事例など、初心者の方でもわかりやすいコンテンツをお届けします。

PythonにおけるBankAccountクラスの設計とオブジェクト指向プログラミングの基本

LYPプレミアム会員 python

クラスとは?

オブジェクト指向プログラミング(OOP)は、現実世界の概念をプログラミングに取り入れ、それをクラスとして表現します。クラスは、属性(変数)とメソッド(関数)を持つオブジェクトの設計図であり、それに基づいて実際のオブジェクトを作成します。本記事では、具体的な例としてBankAccountクラスを設計し、オブジェクト指向プログラミングの基本を解説します。

BankAccountクラスの基本設計

BankAccountクラスは、銀行口座を表すオブジェクトの設計です。基本的な機能として、口座番号、口座名義、残高の3つの属性を持ちます。また、預金と引き出しの2つのメソッドも提供します。

class BankAccount:
    def __init__(self, account_number, account_holder, balance=0):
        self.account_number = account_number
        self.account_holder = account_holder
        self.balance = balance

    def deposit(self, amount):
        self.balance += amount
        return f"Deposit of {amount} yen successful. Current balance: {self.balance} yen"

    def withdraw(self, amount):
        if amount > self.balance:
            return "Insufficient funds. Withdrawal failed."
        else:
            self.balance -= amount
            return f"Withdrawal of {amount} yen successful. Current balance: {self.balance} yen"

このクラスは、初期化メソッド__init__で口座番号、口座名義、残高を初期化し、depositメソッドで預金、withdrawメソッドで引き出しを行います。引き出しの際には残高不足の場合に適切なメッセージを返します。

BankAccountクラスの利用例

BankAccountクラスを使って実際に口座を作成してみましょう。

# BankAccountクラスのインスタンス作成
my_account = BankAccount(account_number="123456", account_holder="John Doe", balance=10000)

# 預金と引き出しの実行
print(my_account.deposit(5000))  # Deposit of 5000 yen successful. Current balance: 15000 yen
print(my_account.withdraw(2000))  # Withdrawal of 2000 yen successful. Current balance: 13000 yen
print(my_account.withdraw(15000))  # Insufficient funds. Withdrawal failed.

my_accountという名前のBankAccountクラスのインスタンスを作成し、depositwithdrawメソッドを呼び出しています。これにより、口座の取引が実行され、残高が正しく更新されています。

カプセル化とプロパティ

OOPの概念の一つである「カプセル化」は、データとそのデータに関連するメソッドを一つのまとまり(クラス)に封じ込めることです。Pythonでは、属性に対して直接アクセスできないようにするために、アンダースコア(_)を使ってプライベートな属性とすることがあります。また、プロパティを使ってアクセスをカスタマイズすることもできます。

class BankAccount:
    def __init__(self, account_number, account_holder, balance=0):
        self._account_number = account_number
        self._account_holder = account_holder
        self._balance = balance

    @property
    def balance(self):
        return f"Current balance: {self._balance} yen"

    @property
    def account_number(self):
        return f"Account number: {self._account_number}"

    @property
    def account_holder(self):
        return f"Account holder: {self._account_holder}"

    def deposit(self, amount):
        self._balance += amount
        return f"Deposit of {amount} yen successful. {self.balance}"

    def withdraw(self, amount):
        if amount > self._balance:
            return "Insufficient funds. Withdrawal failed."
        else:
            self._balance -= amount
            return f"Withdrawal of {amount} yen successful. {self.balance}"

このようにプロパティを利用することで、外部から直接_balanceなどの属性にアクセスすることができなくなり、クラス内での適切な操作が促進されます。

ブログ記事のまとめ

本記事では、BankAccountクラスの設計を通じて、オブジェクト指向プログラミングの基本を紹介しました。クラスとメソッド、カプセル化とプロパティの利用によって、より効果的で再利用可能なコードを構築することができます。これらの概念を理解し、実践することで、柔軟で拡張可能なプログラムを作成するスキルが向上します。

次回の提案テーマ: デザインパターン

次回のテーマとして「デザインパターン」を提案します。デザインパターンは、特定の問題に対する一般的な解決策のテンプレートとして定義されたもので、ソフトウェアの設計において非常に有用です。代表的なデザインパターンやそれらの具体的な適用例につい

て解説することで、より洗練されたプログラミングスキルを身につける手助けとなるでしょう。