【Python入門】クラスとインスタンスをサンプルコードで解説!オブジェクト指向プログラミングの基礎

Pythonにおけるクラスとインスタンスは、オブジェクト指向プログラミングの核となる重要な概念です。この記事では、クラスとインスタンスの基本から実践的な使い方まで、初心者の方にも分かりやすく解説します。クラスを理解することで、より効率的で保守性の高いプログラムを作成できるようになります。

クラスとインスタンスとは?

クラス(Class)

クラスとは、オブジェクトの「設計図」や「型」のようなものです。例えば、「車」というクラスがあれば、そこには車が持つべき属性(色、メーカー、速度など)や機能(走る、止まるなど)が定義されています。

インスタンス(Instance)

インスタンスとは、クラスから実際に作られた「実体」のことです。「車」クラスから作られた「赤いトヨタの車」や「青いホンダの車」がインスタンスにあたります。

基本的なクラスの作り方

1. 最もシンプルなクラス

class Person:
    pass

# インスタンスを作成
person1 = Person()
print(person1)  # <__main__.Person object at 0x...>

2. 属性を持つクラス

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

# インスタンスを作成
person1 = Person("田中", 25)
print(person1.name)  # 田中
print(person1.age)   # 25

3. メソッドを持つクラス

class Person:
    def __init__(self, name, age):
        self.name = name
        self.age = age
    
    def greet(self):
        print(f"こんにちは、{self.name}です")

person1 = Person("佐藤", 30)
person1.greet()  # こんにちは、佐藤です

クラス定義の基本構文

class クラス名:
    def __init__(self, 引数1, 引数2, ...):
        """初期化メソッド(コンストラクタ)"""
        self.属性1 = 引数1
        self.属性2 = 引数2
    
    def メソッド名(self, 引数...):
        """インスタンスメソッド"""
        処理内容
        return 戻り値

重要なポイント

  • クラス名: 大文字で始まる(PascalCase)
  • __init__メソッド: インスタンス作成時に自動実行される
  • self: インスタンス自身を表す特別な引数
  • 属性: インスタンスが持つデータ
  • メソッド: インスタンスが実行できる処理

実践的なクラスの例

1. 銀行口座クラス

class BankAccount:
    def __init__(self, owner, balance=0):
        self.owner = owner
        self.balance = balance
    
    def deposit(self, amount):
        self.balance += amount
        print(f"{amount}円入金しました")
    
    def withdraw(self, amount):
        if self.balance >= amount:
            self.balance -= amount
            print(f"{amount}円出金しました")
        else:
            print("残高不足です")

# 使用例
account = BankAccount("田中", 1000)
account.deposit(500)   # 500円入金しました
account.withdraw(200)  # 200円出金しました
print(account.balance) # 1300

2. 学生クラス

class Student:
    def __init__(self, name, student_id):
        self.name = name
        self.student_id = student_id
        self.scores = []
    
    def add_score(self, score):
        self.scores.append(score)
    
    def get_average(self):
        if self.scores:
            return sum(self.scores) / len(self.scores)
        return 0

# 使用例
student = Student("山田", "S001")
student.add_score(85)
student.add_score(92)
print(f"平均点: {student.get_average()}")  # 平均点: 88.5

3. 商品クラス

class Product:
    def __init__(self, name, price, stock):
        self.name = name
        self.price = price
        self.stock = stock
    
    def sell(self, quantity):
        if self.stock >= quantity:
            self.stock -= quantity
            total = self.price * quantity
            print(f"{self.name}を{quantity}個販売しました")
            return total
        else:
            print("在庫が不足しています")
            return 0

# 使用例
apple = Product("りんご", 100, 50)
total_price = apple.sell(5)  # りんごを5個販売しました
print(f"売上: {total_price}円")  # 売上: 500円

インスタンス変数とクラス変数

インスタンス変数

class Car:
    def __init__(self, color):
        self.color = color  # インスタンス変数

car1 = Car("赤")
car2 = Car("青")
print(car1.color)  # 赤
print(car2.color)  # 青

クラス変数

class Car:
    wheels = 4  # クラス変数(全インスタンスで共有)
    
    def __init__(self, color):
        self.color = color

car1 = Car("赤")
car2 = Car("青")
print(car1.wheels)  # 4
print(car2.wheels)  # 4
print(Car.wheels)   # 4

メソッドの種類

1. インスタンスメソッド

class Calculator:
    def __init__(self, value=0):
        self.value = value
    
    def add(self, num):  # インスタンスメソッド
        self.value += num
        return self.value

calc = Calculator(10)
result = calc.add(5)  # 15

2. クラスメソッド

class Person:
    population = 0
    
    def __init__(self, name):
        self.name = name
        Person.population += 1
    
    @classmethod
    def get_population(cls):  # クラスメソッド
        return cls.population

person1 = Person("田中")
person2 = Person("佐藤")
print(Person.get_population())  # 2

3. 静的メソッド

class MathUtils:
    @staticmethod
    def add(a, b):  # 静的メソッド
        return a + b

result = MathUtils.add(3, 5)  # 8

特殊メソッド(マジックメソッド)

よく使われる特殊メソッド

class Book:
    def __init__(self, title, pages):
        self.title = title
        self.pages = pages
    
    def __str__(self):  # 文字列表現
        return f"「{self.title}」({self.pages}ページ)"
    
    def __len__(self):  # len()関数の動作
        return self.pages
    
    def __add__(self, other):  # + 演算子の動作
        total_pages = self.pages + other.pages
        return Book(f"{self.title} & {other.title}", total_pages)

# 使用例
book1 = Book("Python入門", 200)
book2 = Book("Web開発", 150)

print(book1)  # 「Python入門」(200ページ)
print(len(book1))  # 200

combined = book1 + book2
print(combined)  # 「Python入門 & Web開発」(350ページ)

継承の基本

基底クラスと派生クラス

class Animal:  # 基底クラス
    def __init__(self, name):
        self.name = name
    
    def speak(self):
        pass

class Dog(Animal):  # 派生クラス
    def speak(self):
        return f"{self.name}はワンワンと鳴きます"

class Cat(Animal):  # 派生クラス
    def speak(self):
        return f"{self.name}はニャーと鳴きます"

# 使用例
dog = Dog("ポチ")
cat = Cat("タマ")
print(dog.speak())  # ポチはワンワンと鳴きます
print(cat.speak())  # タマはニャーと鳴きます

よくある間違いと注意点

1. selfの忘れ

# ❌ 間違い
class Person:
    def greet():  # selfが無い
        print("こんにちは")

# ✅ 正解
class Person:
    def greet(self):  # selfを忘れずに
        print("こんにちは")

2. インスタンス変数の初期化忘れ

# ❌ 間違い
class Counter:
    def increment(self):
        self.count += 1  # countが初期化されていない

# ✅ 正解
class Counter:
    def __init__(self):
        self.count = 0  # 初期化
    
    def increment(self):
        self.count += 1

3. クラス変数とインスタンス変数の混同

class MyClass:
    shared = []  # クラス変数(注意が必要)
    
    def add_item(self, item):
        self.shared.append(item)  # 全インスタンスで共有される

# より安全な方法
class MyClass:
    def __init__(self):
        self.items = []  # インスタンス変数
    
    def add_item(self, item):
        self.items.append(item)

実用的なクラス設計のコツ

1. 単一責任原則

# ❌ 責任が多すぎる
class User:
    def save_to_database(self):
        pass
    def send_email(self):
        pass
    def calculate_tax(self):
        pass

# ✅ 責任を分離
class User:
    def __init__(self, name, email):
        self.name = name
        self.email = email

class UserRepository:
    def save(self, user):
        pass

class EmailService:
    def send(self, user, message):
        pass

まとめ

Pythonのクラスとインスタンスの基本から実践的な使い方まで解説しました。オブジェクト指向プログラミングをマスターすることで、より柔軟で保守性の高いプログラムを作成できるようになります。

重要なポイント

  • クラスは設計図、インスタンスは実体
  • __init__メソッドでインスタンスを初期化
  • selfを使ってインスタンス変数にアクセス
  • メソッドでインスタンスの振る舞いを定義
  • 継承で既存クラスを拡張

まずは簡単なクラスから始めて、徐々に複雑な機能を持つクラスの設計にチャレンジしてみましょう。実際にコードを書いて練習することで、オブジェクト指向の概念がしっかりと身に付きます!

■プロンプトだけでオリジナルアプリを開発・公開してみた!!

■AI時代の第一歩!「AI駆動開発コース」はじめました!

テックジム東京本校で先行開始。

■テックジム東京本校

「武田塾」のプログラミング版といえば「テックジム」。
講義動画なし、教科書なし。「進捗管理とコーチング」で効率学習。
より早く、より安く、しかも対面型のプログラミングスクールです。

<短期講習>5日で5万円の「Pythonミニキャンプ」開催中。

<月1開催>放送作家による映像ディレクター養成講座

<オンライン無料>ゼロから始めるPython爆速講座