Pythonで独自のクラスを定義し、そのクラスから実体であるインスタンスを生成する基本を、初心者向けに段階的に解説します。
クラスとオブジェクトの違い、生成の文法、引数の有無、複数インスタンスの扱い、よくあるエラーの見方まで丁寧に説明します。
クラスからインスタンスを生成する基本
クラスとオブジェクトの違いを理解
クラスは「設計図」、インスタンスはその設計図から作られた「実体」です。
クラスはどんなデータを持ち、どんな振る舞いをするかを定義し、インスタンスはその定義に基づいて具体的な値を保持し、メソッドを実行します。
次の表に違いを簡潔に整理します。
観点 | クラス | インスタンス |
---|---|---|
役割 | 設計図や型の定義 | 設計図から作られた具体的なオブジェクト |
作り方 | class 文で定義 | クラス名() として呼び出す |
メモリ上の数 | 定義につき通常1つ | 必要な数だけ複数作れる |
例 | class Dog: ... | Dog() で作った dog1 , dog2 |
属性値 | 共通の構造を定める | 各インスタンスごとに異なる値を持てる |
インスタンス生成の意味とメリット
インスタンスを作る目的は、同じ構造と振る舞いを持つ複数の実体を、異なる状態で扱えるようにするためです。
例えば「ユーザー」というクラスを1つ作れば、ユーザーAとユーザーBを別々の状態で同じ操作(メソッド)により扱えます。
これにより、コードの再利用性が高まり、データと処理を1か所にまとめて読みやすさと安全性が向上します。
Pythonでnewは不要 クラス呼び出しで生成
Pythonでは他言語のような new
は不要です。
クラス名に丸括弧を付けて呼び出すだけでインスタンスが生成されます。
内部的には __new__
と __init__
が関与しますが、通常は意識せずに使えます。
コード
# 最小のクラス定義。pass は「何もしない」の意
class Box:
pass
# クラス名に () を付けて呼ぶとインスタンスが作られる
b = Box()
print(type(b)) # 生成されたオブジェクトの型を表示
print(isinstance(b, Box)) # b が Box のインスタンスか確認
<class '__main__.Box'>
True
インスタンス生成の書き方と例
インスタンス生成の基本構文
インスタンス生成の基本は次の形です。
引数は __init__
メソッドの引数に対応します。
- 構文:
変数名 = クラス名(引数1, 引数2, ...)
class Person:
# __init__ は生成直後の初期化処理を定義する特別なメソッドです
# 最初の引数 self は「自分自身のインスタンス」を表します
def __init__(self, name, age):
self.name = name # インスタンス変数に値を保存
self.age = age
# Person クラスからインスタンスを1つ生成
p = Person("Taro", 20)
print(p.name) # "Taro"
print(p.age) # 20
Taro
20
引数なしでインスタンスを作る
__init__
に引数を取らないクラス、またはすべてにデフォルト値が設定されている場合は、空の括弧で生成できます。
class Counter:
# 引数なしで作れるようにし、カウンタを 0 に初期化
def __init__(self):
self.count = 0
def increment(self):
self.count += 1
def value(self):
return self.count
# 2つのカウンタを独立して生成
c1 = Counter()
c2 = Counter()
c1.increment() # c1 のみ増やす
c1.increment()
c2.increment() # c2 は別の実体。c1 とは独立
print("c1:", c1.value())
print("c2:", c2.value())
c1: 2
c2: 1
引数ありでインスタンスを作る
__init__
に引数を定義すると、生成時に値を渡して初期化できます。
デフォルト引数を使うと柔軟性が高まります。
class Rectangle:
def __init__(self, width, height=1): # height は省略可能に
self.width = width
self.height = height
def area(self):
return self.width * self.height
# 引数を2つ指定
r1 = Rectangle(3, 4)
# height を省略してデフォルト値 1 を使用
r2 = Rectangle(5)
print("r1 area:", r1.area()) # 12
print("r2 area:", r2.area()) # 5
r1 area: 12
r2 area: 5
複数インスタンスの扱いと注意点
複数のオブジェクトを生成して使い分ける
同じクラスから複数のインスタンスを作れば、同じ操作で異なるデータを扱えます。
以下は複数の Rectangle
を作って合計面積を計算する例です。
class Rectangle:
def __init__(self, width, height):
self.width = width
self.height = height
def area(self):
return self.width * self.height
# 3個の長方形を生成し、リストで管理
rects = [
Rectangle(2, 3),
Rectangle(4, 4),
Rectangle(1, 10),
]
total = 0
for i, r in enumerate(rects, start=1):
a = r.area()
print(f"r{i} area = {a}")
total += a
print("total area =", total)
r1 area = 6
r2 area = 16
r3 area = 10
total area = 32
同じクラスでもインスタンスは別の実体
インスタンス同士は独立したオブジェクトです。
片方を変更してももう片方には影響しません。
オブジェクトの同一性は is
、識別番号は id()
で確認できます。
class Box:
def __init__(self, color):
self.color = color
box_a = Box("red")
box_b = Box("red") # 同じ値だが別の実体
print(box_a is box_b) # 同一オブジェクトか
print(id(box_a), id(box_b)) # 識別子は通常異なる
# 片方だけ色を変える
box_a.color = "blue"
print(box_a.color) # blue
print(box_b.color) # red (box_b には影響なし)
False
140517162106512 140517162107088
blue
red
生成時によくあるエラーと確認ポイント
インスタンス生成でつまずきやすいエラーと、その対処の考え方を示します。
例1 必須引数を渡し忘れた
__init__
が引数を要求しているのに渡していないと TypeError
になります。
class User:
def __init__(self, name):
self.name = name
u = User() # name を渡し忘れ
TypeError: User.__init__() missing 1 required positional argument: 'name'
対処として、__init__
のシグネチャを見直し、必要な引数を渡すか、デフォルト値を設定してください。
例2 self を定義し忘れた
__init__
の最初の引数 self
を忘れると、引数の数が合わずエラーになります。
class Bad:
# self を書き忘れている
def __init__(name):
pass
b = Bad("Taro")
TypeError: Bad.__init__() takes 1 positional argument but 2 were given
__init__(self, ...)
のように、必ず先頭に self
を入れてください。
例3 属性名のタイプミス
存在しない属性名を参照すると AttributeError
になります。
class User:
def __init__(self, name):
self.name = name
u = User("Taro")
print(u.nmae) # name のタイプミス
AttributeError: 'User' object has no attribute 'nmae'
属性名はオートコンプリートを活用しながら、定義どおりの綴りでアクセスしてください。
確認ポイントとしては、次のような観点が有効です。
- クラス定義が読み込まれているか(定義や import の漏れがないか)。
__init__
の引数リストと生成時の引数が一致しているか。self
を正しく宣言しているか。- 属性名の綴りや大文字小文字に誤りがないか。
- インスタンス生成では必ず
クラス名()
のように丸括弧を付けているか。
まとめ
本記事では「クラスから実体(オブジェクト)を作りたい」に絞り、インスタンス生成の基本を扱いました。
クラスは設計図、インスタンスはその具体物であり、Pythonでは new
を使わず クラス名()
で生成します。
__init__
を通じて初期化し、引数の有無で柔軟に作成できます。
複数インスタンスは互いに独立し、同じクラスからでも別の実体として扱われます。
よくあるエラーは __init__
の引数不一致、self
の書き忘れ、属性名のタイプミスが中心です。
これらの要点を押さえれば、実用的なクラス設計と安全なインスタンス生成の第一歩を確実に踏み出せます。