見出し画像

プログラミング学習~Python中級編~


はじめに

本記事ではPython学習の中級編として、「クラス」について学習します。Python学習の初級編①~②の内容を理解していることを前提に進めていきますので、まだ読んでいない方は、ぜひ初級編①~②を読んでから本記事をご覧ください。

クラス

クラスとは?

クラスとは、オブジェクト指向プログラミングの基本的な概念であり、データとその操作をまとめて定義するためのテンプレートです。Pythonでは、クラスを使ってオブジェクト(インスタンス)を作成し、そのオブジェクトが持つ属性(データ)やメソッド(関数)を定義します。つまり、クラスを一言で言ってしまうと「設計図」になります。この設計図を元に作成される物が「オブジェクト」になります。

クラスの使い方①

クラスは「class クラス名:コンストラクタ メソッド① メソッド②,,,」の様にコーディングしていきます。この時メソッドの()にselfを付ける事を忘れないようにしましょう!!

# クラスの作成
class Car:
    def __init__(self, color, price):
        self.color = color
        self.price = price

    def prius(self):
        return f"このプリウスは{self.color}です。価格は{self.price}です。"

# オブジェクトの作成(インスタンス化)
my_car = Car("黒色", '1,500,000')
print(my_car.prius())

先ほどのコードについて解説していきます。

まず、Carという名前のクラスを定義します。このクラスには、車の色(self.color)と価格(self.price)を属性として持ち、それを初期化するための__init__メソッドと、車の情報を表示するためのpriusメソッドがあります。
このCarクラスをインスタンス化し、my_carというオブジェクトを作成します。その後、priusメソッドを呼び出す事によりpriusメソッドの処理が行われています。

先ほど出てきた__init__メソッドについて説明します。
__init__メソッドはコンストラクタとも呼ばれています。この、コンストラクタは特殊なメソッドであり、Carをインスタンス化すると必ず実行されるものになります。このコンストラクタでは、引数として渡された「color」、「price」を元に、クラス内のメソッド間で共有可能な変数である、self.colorやself.priceという形のインスタンス変数を作成しています。
インスタンス変数にする事でクラス内のメソッドであるpriusメソッドは、引数を指定しなくても「color」、「price」の値を使用する事ができるようになっています。

クラスの使い方②

メソッドも従来の関数と同様に引数を受け取り、処理する事ができます。ここで、先ほど作成したCarクラスに新たにalfordメソッドを追加しました。
このalfordメソッドは、priusメソッドとは違い個別で引数を受けとり、受け取った引数を使用し、走行距離を算出する処理を行っています。
この様に、各メソッドのみ必要な引数を渡してあげる事も可能であり、
渡し方は、alfordメソッドを呼び出す際にalford(23)と記載し、従来の関数の様にします。この時Carクラスのインスタンスを作成する際に、Car("黒色", '4,500,000', 23)とすると、エラーが発生しますので気を付けてください。

# クラスの作成
class Car:
    def __init__(self, color, price):
        self.color = color
        self.price = price

    def prius(self):
        return f"このプリウスは{self.color}です。価格は{self.price}です。"
    
    def alford(self, mileage):
         mileage = mileage*1000
         return f"このアルフォードは{self.color}です。価格は{self.price}です。現在の走行距離は{mileage}mです。"

# オブジェクトの作成(インスタンス化)
my_car = Car("黒色", '4,500,000')
print(my_car.alford(23))

クラスの使い方③

次に既存のクラスを元に別のクラスの作成を行う「継承」について説明していきます。継承の仕方としては「class 新しいクラス名(継承元のクラス名):メソッド① メソッド②,,,」の様にコーディングしていきます。

# 継承元クラスの作成
class Car:
    def __init__(self, color, price):
        self.color = color
        self.price = price

    def prius(self):
        return f"このプリウスは{self.color}です。価格は{self.price}です。"
    
    def alford(self, mileage):
         mileage = mileage*1000
         return f"このアルフォードは{self.color}です。価格は{self.price}です。現在の走行距離は{mileage}mです。"

# 継承するクラスの作成
class NissanCar(Car):
    def note(self):
      return f"この車は日産社製です。ノートは{self.color}です。価格は{self.price}です。"

# オブジェクトの作成(インスタンス化)
my_car = NissanCar("青色", '2,200,000')
print(my_car.note())

先ほどのコードについて解説していきます。

まず、「class NissannCar」で新しいクラスを定義し、「NissanCar(Car)」の形で継承元のクラス名を指定しています。それ以外の部分については「クラスの使い方①」で説明した内容と同じですが、NissanCarクラスにはコンストラクタが存在していないのに、self.colorやself.priceなどのインスタンス変数が参照できています。これが何故かというと、Carクラスに定義しているため、Carクラスを継承したNissanCarも使用できるようになっているからです。

クラスの使い方④

クラスを継承する事で、継承元のメソッドを利用できるようになるのですが、更に、継承先で元のコンストラクタに対して処理を追加する事ができます。下記のコードの様に「super().__init__(color, price)」と記載し、その次に「self.production_date = production_date」と記載する事で新しいインスタンス変数を用意する事できます。もちろんこれはNissannCarのコンストラクタになるため、継承元のクラスから呼び出されません。

# 継承元クラスの作成
class Car:
    def __init__(self, color, price):
        self.color = color
        self.price = price

    def prius(self):
        return f"このプリウスは{self.color}です。価格は{self.price}です。"
    
    def alford(self, mileage):
        mileage = mileage*1000
        return f"このアルフォードは{self.color}です。価格は{self.price}です。現在の走行距離は{mileage}mです。"

# 継承するクラスの作成
class NissanCar(Car):
    def __init__(self, color, price, production_date):
        super().__init__(color, price)
        self.production_date = production_date
      
    def note(self):
        return f"この車は日産社製です。ノートは{self.color}です。価格は{self.price}です。{self.production_date}に販売開始されました。"

# オブジェクトの作成(インスタンス化)
my_car1 = NissanCar("青色", '2,200,000', '2005年1月')
print(my_car1.note())

# 親クラスのインスタンス化
my_car2 = Car("黒色", "1,500,000")
print(my_car2.prius())

まとめ

最後にPythonのクラスの重要ポイントをまとめます。

  • classから始まるブロックでクラスの属性と、メソッドを定義する。

  • 「def __init__(self, 引数):」から始まるコンストラクタで、クラスの属性(=インスタンスの変数)を定義する。

  • 継承とは、一度作ったクラスのコンストラクタやインスタンスメソッドを引き継いだ子クラスを簡単に作ることができる。

これらの内容を参考に、実際に、様々なクラスを作ってみましょう。

この記事が気に入ったらサポートをしてみませんか?