ユーニックス総合研究所

  • home
  • archives
  • python-class

わかりやすいPythonのclassの使い方

  • 作成日: 2021-05-24
  • 更新日: 2023-12-24
  • カテゴリ: Python

Pythonのclassの使い方

Pythonには複数の変数や関数をまとめることができるclass(クラス)という考え方があります。
classを使うとオブジェクト指向的に変数と関数をセットで扱うことが可能になります。

この記事ではclassについて詳しく解説します。
結論から言うとclassは↓のように書きます。

class Animal:  
    def __init__(self, name, age):  
        self.name = name  
        self.age = age  

    def show_name(self):  
        print(self.name)  

    def show_age(self):  
        print(self.age)  


animal = Animal('Pochi', 20)  
animal.show_name()  
# Pochi  
animal.show_age()  
# 20  

classについて具体的に↓を見ていきます。

  • クラスとは?
  • クラスの作成
  • クラスのメソッド
  • クラスの初期化メソッド
  • 変数とメソッドを定義したクラス

クラスとは?

そもそもクラスとはどういうものなんでしょうか?
クラスとは、変数と関数をまとめる箱みたいなものです。
箱の中に変数や関数を放り込んで、その箱を取りまわしてプログラミングをするわけです。

オブジェクト指向と言う考え方では、クラスを作ってプログラミングするというのが一般的です。
オブジェクト指向ではカプセル化とかポリモーフィズム、継承とかいろいろむずかしい概念があるんですが、ここではそれらは省略して解説します。

クラスというのはボールを生み出す箱です。
箱の中には変数や関数を入れます。そしてその箱からはボールを生み出せます。
このボールには箱の中の変数や関数のコピーが保存されています。

箱からは無数にボールを生み出すことができます。
生み出したボールの変数や関数にアクセスすることで、プログラミングをやりやすくします。

グローバル変数とグローバル関数との違いは、スコープがボールごとに限定されるという点です。
そのためボールの名前を変えれば変数や関数の名前は衝突しないし、ボールごとに個別の状態を持たせることができます。

クラスの作成

それでは箱となるクラスを作成します。
Pythonではクラスは↓のような記述で作成します。

class クラス名:  
    クラスの中身  

classというキーワードを書いてその横にクラス名を書きます。これは箱の名前のことです。
そしてコロンで改行してクラスの中身を書きます。ここには変数や関数を書きます。

Animalという空のクラスを作ってみます。
その場合は↓のようなコードになります。

class Animal:  
    pass  

クラスの中身を空にする場合は↑のようにpassを書きます。
これで空のクラスの作成が完了しました。

あとはこのクラス(箱)からボールを生成してみましょう。
ボールを生成するには↓のようにします。

ボール名 = クラス名()  

コードにすると↓のようになります。

animal = Animal()  

↑のanimalというのがボールです。
このボールのことをPythonではオブジェクトまたはインスタンスと呼びます。

このボールはもう使うことができます。
↓のようにprint()で出力してみると↓のような出力になります。

print(animal)  
# <__main__.Animal object at 0x1234>  

このボールは空の箱から作りましたので、中身は空っぽです(厳密に言うと空っぽじゃないんですが)。
では箱に変数や関数を入れてみたいと思います。

クラスのメソッド

クラスに入れられる関数のことをメソッドと呼びます。
これは普通の関数とメソッドを区別するためにこう呼ばれています。

クラスのメソッドは↓のように書きます。

def メソッド名(self):  
    メソッドの中身  

基本的にはメソッドは関数と同じふうに書きます。
メソッド名は関数名です。
1つ関数と違うのは、クラスのメソッドには第1引数に必ずselfという引数が渡されることです。
このselfはクラスのオブジェクト、つまりボールを指します。

ではクラスと一緒にメソッドを書いてみます。
コードでは↓のようになります。

class Animal:  
    def show_name(self):  
        print('Pochi')  

↑のshow_name()というメソッドは名前を表示するメソッドです。
これを呼び出すと画面に「Pochi」と出力されます。

ではこのクラス(箱)をオブジェクト(ボール)にしてみます。
そしてオブジェクトから先ほどのメソッドを呼び出します。

animal = Animal()  
animal.show_name()  
# Pochi  

無事にanimalというオブジェクトからshow_name()というメソッドを呼ぶことができました。
クラスには無数にメソッドを定義できます。

クラスの初期化メソッド

クラスのメソッドにはあらかじめ予約されている特別なメソッドがいくつかあります。
__init__()はその中のメソッドの1つです。

__init__()はクラスからオブジェクトが作成され、オブジェクトが初期化される時に呼ばれます。
この__init__()の中でオブジェクトに変数などを初期化することが可能です。

__init__()は↓のように書きます。

def __init__(self):  
    初期化内容  

コードにすると例えば↓のようになります。

class Animal:  
    def __init__(self):  
        self.name = 'Pochi'  

↑のコードでは__init__()の中でselfに対してnameという変数を初期化しています。
selfはオブジェクトを指すので、nameという変数はオブジェクトに対して設定されます。
この状態のクラスからオブジェクトを作成してみます。

animal = Animal()  
print(animal.name)  
# Pochi  

↑のようにanimal.namename変数にアクセスすることができます。
このときnameのことをオブジェクト変数またはインスタンス変数と言います。

__init__()には引数を指定することができます。
たとえばnameという引数を作ります。

class Animal:  
    def __init__(self, name):  
        self.name = name  

そのnameという引数を↑のようにnameというオブジェクト変数に代入します。
__init__()name引数にはどのように値を指定するのかと言うと、これはクラスからオブジェクトを生成するときに指定します。

animal = Animal('Pochi')  
print(animal.name)  
# Pochi  

↑のようにAnimal('Pochi')と書くことで__init__()name引数にPochiという文字列を渡すことができます。
このようにクラスのオブジェクトの変数は外部から注入することができます。

変数とメソッドを定義したクラス

では最後になりますが、クラスにメソッドと変数を定義してみます。
↓のようなコードを書きます。

class Animal:  
    def __init__(self, name, age):  
        self.name = name  # 名前  
        self.age = age  # 年齢  

    def show_name(self):  
        print(self.name)  

    def show_age(self):  
        print(self.age)  

↑のクラスはshow_name()show_age()というメソッドを持ち、さらにnameageというオブジェクト変数を持ちます。
↑のクラスをオブジェクトにして各メソッドを呼び出します。

animal = Animal('Pochi', 20)  
animal.show_name()  
# Pochi  
animal.show_age()  
# 20  

↑のようにshow_name()ではPochiが、show_age()では20が出力されています。

おわりに

クラスの概念はわかりづらいものですが、箱からボールを生成するものだと考えれば非常にシンプルなものだとわかります。
継承やカプセル化、ポリモーフィズムなどについてはこの記事に書いてあることがわかるようになってからでOKです。そうでないと混乱すると思います。

🦝 < クラスというひな型からオブジェクトを生み出していく

🐭 < 量産体制準備完了