見出し画像

classの話

Pythonを勉強していくと、遅かれ早かれ「class」という壁にぶつかります(自分だけ?)。説明を読んでもイメージしにくいですよね。実際にコードを書いて「メリット」を実感しながら勉強すると分かりやすいかもしれません。


classとは?

「classは、オブジェクト指向プログラミングで使われる構造で、データとそのデータに対する操作(メソッド)をひとまとめにしたもの」と書かれていたりしますが、よくわかりません。

よくclassは「設計図」に例えられます。その設計図をもとにつくられる対象物がオブジェクト(インスタンス)です。
設計図には、素材(属性)どのように処理するか(メソッド)がまとめて書かれているとイメージすると良いかもしれません。

例えば、銀行口座をイメージしてみてください。口座を作ると、そこからお金を出し入れすることができます。口座には、預け入れや引き出しという機能(メソッド)が備わっており、Aさんの口座(オブジェクト)でもBさんの口座でも同じです。
ここでいう口座のように、同じ種類のデータを複数作る必要があるときに設計図があれば便利ですよね。また、預け入れや引き出しという機能がまとまっていれば、何度も同じようなコードを書く必要がなくなります。classを上手く使えば、再利用性が向上しコードを整理することができます。

具体例

サンプルコード

最初にサンプルコードを提示します。

class BankAccount:
    # 初期化メソッド
    def __init__(self, owner, zandaka):
        self.owner = owner  # 口座の所有者名
        self.zandaka = zandaka  # 初期残高

    # 預け入れメソッド
    def azukeire(self, amount):
        self.zandaka += amount
        print(f"{amount}円を預け入れました。")

    # 引き出しメソッド
    def hikidashi(self, amount):
        self.zandaka -= amount
        print(f"{amount}円を引き出しました。")

    # 残高確認メソッド
    def check_zandaka(self):
        print(f"{self.owner}の口座残高: {self.zandaka}円")


class作成のルールと基本

classはただの設計図なので、まずは対象物(オブジェクト)を作る必要があります。オブジェクトを作成する時に呼ばれるメソッドがdef __init__(self, …)です。第一引数は必ずselfが入ります。

class クラス名:
     def __init__(self, 引数2, 引数3, …):
          self.引数2' = 引数2          ←変数へ格納
          self.引数3' = 引数3          ←  〃

第二引数以降は、classで扱いたいデータを入力することになります。サンプルコードで言うと、owner(口座所有者)とzandaka(口座残高)になります。
次に、このデータをインスタンス(オブジェクト)変数へ格納しておきます。それが「self.引数2' = 引数2」の部分です。こうすることで、インスタンス変数を用いて後に続く計算などの処理を記述することができます。
預け入れメソッド以降を見てみると分かりますが、第一引数にselfを入れることで、初期化メソッドで定義したインスタンス変数を使用することができます。

動かしてみよう!

さっそく実行しながら挙動を確認していきます。
まずは、設計図(class)に基づいてオブジェクト(口座)を作ります。
BankAccountのオブジェクトを作成するために初期化メソッドで定義したself以外の引数に対応するデータを入力します。
例えば、田中さんが口座を作り1,000円を預け入れる場合は以下のようになります。

ba001 = BankAccount('Tanaka', 1000)

これで、田中さんの口座(ba001)が作成されました。
この口座に対し、class内で定義したメソッドを使用することができます。
追加で50,000円預けた場合、預け入れメソッド(azukeire())を使用しますが、やはりself以外の引数に対応する50000を入力します。

ba001.azukeire(50000)

同様に引き出し処理や残高確認も出来ます。

ba001.hikidashi(2000)
ba001.check_zandaka()

設計図があれば、他のオブジェクト(口座)も簡単に作る事ができます。

ba002 = BankAccount('Suzuki', 15000)
ba003 = BankAccount('Yamada', 2500)

当然ですが、ba002やba003といった口座に対しても預け入れや引き出し、残高確認の機能が備わっています。


実際に書いてみると、少しイメージしやすくなったのではないでしょうか?設計図を作る(この段階では対象物がない)のでイメージしにくいですが、コード上で"self"が対象物と同じような役割をしています。慣れるまでは難しそうな感じですが、とても便利な機能ですね!

いいなと思ったら応援しよう!