「Pythonで関数や辞書は書けるようになったけれど、クラスが出てきた途端に分からなくなった……」という声は、初心者の方からとてもよく聞きます。self や __init__ といった見慣れない言葉が並ぶので、最初はとっつきにくく感じますよね。
この記事では、現役SEの運営者が、Pythonのクラスを「設計図」というイメージから順番に解説します。基本の書き方、__init__ と self、メソッド、__str__、継承までを、実際に動くコードと実行結果つきで説明しますので、一緒に手を動かしてみてください。
クラスとは?「設計図」と「実物」で考えよう
クラスとは、データ(属性)とそのデータを扱う処理(メソッド)をひとまとめにした「設計図」です。たとえば「犬」という設計図があれば、そこから「ポチ」「ハチ」といった実物(インスタンス)をいくつでも作れます。
- クラス:設計図(例:Dog)
- インスタンス:設計図から作った実物(例:ポチ)
- 属性:インスタンスが持つデータ(例:名前、年齢)
- メソッド:インスタンスができる動作(例:吠える)
関数だけで書くとデータと処理がバラバラになりがちですが、クラスを使うと「関連するものを1か所にまとめる」ことができ、プログラムが大きくなっても整理しやすくなります。関数の基本に自信がない方は、先にPythonの関数(def)の書き方を確認しておくとスムーズです。
クラスの基本の書き方:__init__ と self
まずは最小限のクラスを見てみましょう。
class Dog:
def __init__(self, name, age):
self.name = name
self.age = age
def bark(self):
print(f"{self.name}:ワンワン!")
pochi = Dog("ポチ", 3)
print(pochi.name) # ポチ
print(pochi.age) # 3
pochi.bark() # ポチ:ワンワン!__init__ は「作られるときに最初に呼ばれる」メソッド
__init__ は初期化メソッド(コンストラクタ)と呼ばれ、Dog(“ポチ”, 3) のようにインスタンスを作った瞬間に自動で実行されます。ここで名前や年齢といった初期データを受け取って保存します。
self は「そのインスタンス自身」
self は「いま操作しているインスタンス自身」を指します。self.name = name と書くことで、そのインスタンス専用の属性として名前が保存されます。メソッドを定義するときは、第1引数に必ず self を書くのがルールです(呼び出すときは書きません)。
ここまでで、クラスの土台はおしまいです。独学で「self がどうしても腑に落ちない」と詰まったときは、現役エンジニアに質問できる環境があると一気に進みます。学習方法の選び方は【徹底比較】Pythonが学べるプログラミングスクールの選び方で比較軸をまとめていますので、独学で伸び悩んだら参考にしてください。
インスタンスはいくつでも作れる
同じ設計図から作ったインスタンスは、それぞれ独立したデータを持ちます。
pochi = Dog("ポチ", 3)
hachi = Dog("ハチ", 5)
pochi.bark() # ポチ:ワンワン!
hachi.bark() # ハチ:ワンワン!
print(pochi.age) # 3
print(hachi.age) # 5メソッドで属性の値を変えてみよう
メソッドの中で self の属性を書き換えると、そのインスタンスの状態が変わります。カウンターを例に見てみます。
class Counter:
def __init__(self):
self.count = 0
def increment(self):
self.count += 1
return self.count
c = Counter()
c.increment()
c.increment()
print(c.count) # 2「状態(count)」と「それを変える処理(increment)」がセットになっているのがクラスの便利なところです。辞書でデータを管理する方法と比べてみたい方は、Pythonの辞書(dict)の使い方もあわせて読むと違いが分かりやすくなります。
__str__ で print の表示を分かりやすくする
クラスのインスタンスをそのまま print すると、__main__.Book object at 0x…> のような分かりにくい表示になります。__str__ メソッドを定義すると、表示内容を自由に決められます。
class Book:
def __init__(self, title, price):
self.title = title
self.price = price
def __str__(self):
return f"{self.title}({self.price}円)"
book = Book("Python入門", 2000)
print(book) # Python入門(2000円)継承:既存のクラスを引き継いで拡張する
継承を使うと、既存のクラス(親クラス)の機能を引き継いだ新しいクラス(子クラス)を作れます。同じ処理を何度も書かずに済み、必要な部分だけ上書き(オーバーライド)できます。
class Animal:
def __init__(self, name):
self.name = name
def speak(self):
print(f"{self.name}は鳴きます")
class Cat(Animal):
def speak(self):
print(f"{self.name}:ニャー")
Animal("ゾウ").speak() # ゾウは鳴きます
Cat("タマ").speak() # タマ:ニャーCat は __init__ を書いていませんが、親の Animal のものがそのまま使われています。speak だけを上書きしているのがポイントです。
初心者がつまずきやすいポイント
- メソッドの第1引数の self を書き忘れる(TypeError の原因になります)
- 属性を使うときに self. を付け忘れ、ただのローカル変数になってしまう
- __init__ のアンダースコアは前後2つずつ(_init_ では動きません)
- クラス名は大文字始まり(Dog など)にするのが慣習
もっと効率的にPythonを学びたい人へ
クラスは、読むだけでは理解しにくく、自分で書いてエラーを経験することで身につく分野です。「エラーの原因が分からない」「自分のコードが正しい設計か不安」という場合は、マンツーマンで質問できるスクールを使うのも一つの方法です。
Winスクールの「Python Winner」は、マンツーマン指導で未経験からPythonを学べ、転職サポートや無料カウンセリングにも対応しています。まずは無料カウンセリングで、自分に合うか確かめてみてはいかがでしょうか。
※本記事には広告(アフィリエイトリンク)を含みます。
Pythonプログラミング|マンツーマンレッスンで初めてをプロに育てる【Python Winner】![]()
他のスクールとも比べて選びたい方は、スクールの比較記事もあわせてご覧ください。資格取得を目指す方はPython3エンジニア認定基礎試験の参考書比較も参考になります。
まとめ
- クラスは「設計図」、インスタンスはそこから作る「実物」
- __init__ で初期データを受け取り、self.属性名 で保存する
- self は「そのインスタンス自身」を指し、メソッドの第1引数に必ず書く
- メソッドで属性を書き換えると、インスタンスの状態を管理できる
- __str__ を定義すると print の表示を分かりやすくできる
- 継承を使えば、既存クラスを引き継いで必要な部分だけ上書きできる
まずはDogやCounterのような小さなクラスを自分で書いてみて、動かしながら慣れていきましょう。クラスが分かると、ライブラリのコードも読みやすくなります。
ナノトイラボ 
