Pythonのクラス入門:class・init・self・オブジェクトの基本

python logo notext.svg

Pythonのクラスは、関連するデータと処理をひとまとめにして管理できる仕組みです。プログラムが大きくなるほど、クラスを使うことでコードを整理しやすくなります。本記事では、class・init・self・オブジェクトといった基本概念をわかりやすく解説します。

Pythonの導入についてはこちら。

Python入門:最初のプログラムを作って実行する方法 – Lean Data Office

Python環境構築のやり方|初心者向け完全ガイド – Lean Data Office

すでに「トースター」を例に関数の話をしましたが、もし「キッチン全体」を作りたいとしたらどうでしょうか?
キッチンには多くの機能があります。トーストを焼く、オーブンで焼く、電子レンジで温める、食器を洗う、そしてもちろん欠かせないコーヒーメーカーもあります。

こうしたキッチンの家電には、それぞれ設定があります。トースターにはダイヤル、電子レンジには出力設定がありますし、食洗機には複数のモードがあります。

もちろん、たくさんの関数や変数を作って、どこかのファイルにまとめることもできるでしょう。
しかし、もし「2つのキッチン」を作りたい場合はどうでしょうか?それぞれ異なる機能や設備を持っている場合です。

さらに「家全体」を作る場合はどうでしょう?キッチン、洗濯室、バスルームなどがありますよね。
洗濯室がなくて、コインランドリーを使う家もあるかもしれません。

このように考えると、関数や変数がどんどん増え、最終的には数十〜数百の関数、数千の変数になり、コードはすぐに長くて管理しにくくなってしまいます。

そこで登場するのが「クラス」です。
Pythonのクラスは、関連する関数や属性をまとめて整理するための非常に便利な仕組みです。

クラスを定義する

ではコードを見てみましょう。

class Dog:
    def __init__ (self):
        self.name = 'Rover'
        self.legs = 4

    def speak(self):
        print(self.name + ' says: Bark!')

クラスの説明ではよく動物が使われるので、「Dog(犬)」というクラスを作ります。

image

クラス名は大文字で始めるのが慣習で、これが変数や関数との違いになります。
コロン(:)の後はインデントし、その中にクラスの内容を書きます。

まず定義するのは特別な関数、__init__ です。
これは「初期化関数」と呼ばれ、クラスのインスタンス(実体)が作られるときに自動的に呼ばれます。

def __init__ (self):

ここで self という引数を使います。
これは「そのインスタンス自身」を指します。

犬の属性を定義してみます:

self.name = 'Rover'
self.legs = 4

メソッドを定義する

さらに、鳴く機能を追加します:

def speak(self):
        print(self.name + ' says: Bark!')

self を使うことで、このクラスの属性にアクセスできます。

では、このクラスを使います。

my_dog = Dog()
another_dog = Dog()
image

これで2つの犬が作られました(これを「インスタンス」や「オブジェクト」と呼びます)。

2つの犬インスタンスに対してspeakメソッドを使ってみます。

my_dog.speak()
another_dog.speak()
image

どちらも「Rover says bark」と表示されます

ただし、どちらも「Rover」という名前なので少し分かりにくいですね。

そこで、名前を外から渡せるようにします:

class Dog:
    def __init__ (self, name):
        self.name = name
        self.legs = 4

    def speak(self):
        print(self.name + ' says: Bark!')
image
my_dog = Dog('Rover')
another_dog = Dog('Fluffy')
image

名前を渡せるようにしたので、ここで改めてspeakメソッドを使ってみます。

my_dog.speak()
another_dog.speak()
image

「Rover says bark」「Fluffy says bark」となり、より分かりやすくなります

ここでポイント。

my_dog.speak()

このとき、引数は書いていませんが、実際には self が自動的に渡されています。
つまり、この関数は実質的に「自分自身のデータを使って動いている」ということです。

補足:用語整理

あたらしい用語がたくさん出てきたので、最後に整理します。

  • クラス → 設計図(Dog)
  • インスタンス(オブジェクト) → 実体(my_dog)
  • 属性(attribute) → データ(name, legs)
  • メソッド(method) → 機能(speak)

クラスは、関連するデータと処理をひとまとまりに管理するための仕組みです。initやselfを使うことで、各インスタンスに固有のデータを持たせることができます。また、属性やメソッドの考え方を理解することで、オブジェクト指向の基本を身につけることができます。これらを活用することで、より大規模で保守しやすいプログラムが作成できるようになります。

筋トレとオートメーションが趣味。 モバイルアプリ個人開発者。 データ処理・可視化とレポートにハマり備忘録と情報共有のためにブログ開設し運営している。