閉じる

Python入門: クラスからインスタンスを生成するやり方

Pythonで独自のクラスを定義し、そのクラスから実体であるインスタンスを生成する基本を、初心者向けに段階的に解説します。

クラスとオブジェクトの違い、生成の文法、引数の有無、複数インスタンスの扱い、よくあるエラーの見方まで丁寧に説明します。

クラスからインスタンスを生成する基本

クラスとオブジェクトの違いを理解

クラスは「設計図」、インスタンスはその設計図から作られた「実体」です。

クラスはどんなデータを持ち、どんな振る舞いをするかを定義し、インスタンスはその定義に基づいて具体的な値を保持し、メソッドを実行します。

次の表に違いを簡潔に整理します。

観点クラスインスタンス
役割設計図や型の定義設計図から作られた具体的なオブジェクト
作り方class 文で定義クラス名() として呼び出す
メモリ上の数定義につき通常1つ必要な数だけ複数作れる
class Dog: ...Dog() で作った dog1, dog2
属性値共通の構造を定める各インスタンスごとに異なる値を持てる

インスタンス生成の意味とメリット

インスタンスを作る目的は、同じ構造と振る舞いを持つ複数の実体を、異なる状態で扱えるようにするためです。

例えば「ユーザー」というクラスを1つ作れば、ユーザーAとユーザーBを別々の状態で同じ操作(メソッド)により扱えます。

これにより、コードの再利用性が高まり、データと処理を1か所にまとめて読みやすさと安全性が向上します。

Pythonでnewは不要 クラス呼び出しで生成

Pythonでは他言語のような new は不要です。

クラス名に丸括弧を付けて呼び出すだけでインスタンスが生成されます。

内部的には __new____init__ が関与しますが、通常は意識せずに使えます。

コード

Python
# 最小のクラス定義。pass は「何もしない」の意
class Box:
    pass

# クラス名に () を付けて呼ぶとインスタンスが作られる
b = Box()

print(type(b))          # 生成されたオブジェクトの型を表示
print(isinstance(b, Box))  # b が Box のインスタンスか確認
実行結果
<class '__main__.Box'>
True

インスタンス生成の書き方と例

インスタンス生成の基本構文

インスタンス生成の基本は次の形です。

引数は __init__ メソッドの引数に対応します。

  • 構文: 変数名 = クラス名(引数1, 引数2, ...)
Python
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__ に引数を取らないクラス、またはすべてにデフォルト値が設定されている場合は、空の括弧で生成できます。

Python
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__ に引数を定義すると、生成時に値を渡して初期化できます。

デフォルト引数を使うと柔軟性が高まります。

Python
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 を作って合計面積を計算する例です。

Python
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() で確認できます。

Python
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 になります。

Python
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 を忘れると、引数の数が合わずエラーになります。

Python
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 になります。

Python
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 の書き忘れ、属性名のタイプミスが中心です。

これらの要点を押さえれば、実用的なクラス設計と安全なインスタンス生成の第一歩を確実に踏み出せます。

Python 実践TIPS - クラスとオブジェクト指向
この記事を書いた人
エーテリア編集部
エーテリア編集部

人気のPythonを初めて学ぶ方向けに、文法の基本から小さな自動化まで、実際に手を動かして理解できる記事を書いています。

クラウドSSLサイトシールは安心の証です。

URLをコピーしました!