クラスとオブジェクト

クラスとオブジェクト

クラスとオブジェクト

 Pythonでは、あらゆるものが オブジェクト です。整数 100 はオブジェクトであり、文字列 "Python" や真偽値の True や False もオブジェクトです。すべてのオブジェクトは何かのクラスに属しています。Type()関数を使うと、あるオブジェクトがどのクラスに分類されているかを調べることができます。

# 100のクラス
print(type(100))

# "Python" のクラス
print(type("Python"))

# Trueのクラス
print(type(True))
<class 'int'>
<class 'str'>
<class 'bool'>

 サンプルコードを実行すると、100 は intクラス、"Python" は strクラス、True は boolクラスに属していることがわかります。

クラスとインスタンス

 クラスはオブジェクトの性質を定義するものです。オブジェクトがプログラミングに欠かせない部品であるとすれば、クラスは部品の設計図です。設計図(クラス)から部品(オブジェクト)を製造することを「クラスのインスタンス化」と表現します。すべてのオブジェクトはあるクラスのインスタンスとして生成されます。intクラスから 100 や 200 というインスタンスが作られ、strクラスから "apple" や "orange" というインスタンスが作られます。「インスタンス」と「オブジェクト」は同じ意味なのですが、あるクラスから作られたオブジェクトであることを強調したいときに、インスタンスという言葉を使います。

 Pythonには、intクラスや floatクラス, strクラスなど、あらかじめ用意されている組み込みのクラスがあります。これらのクラスから生成するインスタンス(オブジェクト)は頻繁に活用するので、特別な手続きなしで使えるようになっています。

 モジュールをインポートすると、組み込み以外のクラスを使うことができるようになります。たとえば、fractionsモジュールをインポートすると、Fraction というクラスが追加されます。Fractionクラスからは分数(有理数)というインスタンスを作ることができます。
 

クラスの定義

 クラスは自分で定義することもできます。
 以下のサンプルコードでは、Rectangles というクラスを定義しています。
 Rectangle とは「長方形」という意味です。

# https://python.atelierkobato.com/class/

# Rectanglesクラスの定義
class Rectangles:
    def __init__(self, a, b):
        self.width = a
        self.length = b
    
    def area(self):
        return self.width * self.length

# Rectanglesクラスのインスタンスを生成
rec_1 = Rectangles(10, 20)
rec_2 = Rectangles(30, 30)

print(rec_1.width, rec_1.length, rec_1.area())
print(rec_2.width, rec_2.length, rec_2.area())
10 20 200
30 30 900

 クラスを定義するときは、

 class クラス名:
   スイート

という形式で記述します。一般的にクラス名は関数やメソッド、あるいは組み込みのクラスと区別するために、クラス名の先頭は大文字にするという慣例があります。上のサンプルコードでは Rectangles がクラス名です。クラス名のあとに改行し、半角 4 文字でインデントして、[スイート] とよばれる部分にクラスのもつ性質を定義します。

 クラスにメソッドを定義するときには def文を記述します。
 その記法は関数を定義するときと同じですが、クラスメソッドの第 1 引数には必ず self を指定します(引数名は self でなくても文法上は問題ありませんが、これも Pythonコミュニティの約束事なので守るようにしてください)。インスタンスが生成されると、self にインスタンス自身が渡されることになります。

 __init__() は、インスタンスが作られるときに自動的に実行される初期化メソッドとよばれるものです。Rectangles クラスでは初期化メソッドの引数として、self 以外に a, b という 2 種類の引数(長方形の各辺の長さ)を用意しています。

    def __init__(self, a, b):
        self.width = a
        self.length = b

 インスタンスが作られると同時に、self.width, self.length にそれぞれ引数 a, b の値を渡されます。
 self.[変数名] はインスタンス変数とよばれる変数です。インスタンスが作られるとき、引数には様々な値が渡されるので、個々のオブジェクトのもつインスタンス変数は互いに異なっています。縦横の長さが (10, 20) の長方形もあれば、(15, 30) や (50, 80) の長方形もあります。(50, 50) という正方形も長方形の一種です。確かにどれも少しずつ異なっているのですが、「二辺の長さをもつ」という長方形の性質は維持されています。

 Python Rectangles(長方形)クラスのインスタンス

 Rectangles クラスには、もうひとつ、area() というメソッドが定義されています:

    def area(self):
        return self.width * self.length

 area()メソッドは長方形の面積を返します。このメソッドを呼び出すときに引数を指定する必要はありませんが、内部ではインスタンス変数 self.width, self.length を掛け合わせて面積を計算しています。
 

インスタンスの生成

 Rectanglesクラスのインスタンスを作ってみましょう。
 サンプルコードにあるように、

rec_1 = Rectangles(10, 20)

と記述すると、辺の長さが (10, 20) の長方形が作られます。オブジェクトのインスタンス変数を取得したいときには、

 オブジェクト.インスタンス変数名

と記述します。たとえば

print(rec_1.width)

という記述で、width に代入されている値を知ることができます。メソッドの使い方はもうおなじみだと思いますが、

 オブジェクト.メソッド

です。rec_1 の面積は

print(rec_1.area())

という記述で表示させることができます。