【Python入門】オブジェクト指向をやさしく解説!実務・AI開発にも役立つ基礎知識

2025.12.8
カテゴリー:DX,オフショア開発,開発

 

Pythonを学び始めたばかりの方が、必ずと言っていいほどつまずくのがオブジェクト指向(Object-Oriented Programming:OOP)という概念です。

 

関数と変数だけでコードは書けるのに、なぜクラスやオブジェクトが必要なの?

 「オブジェクト指向って、結局何が便利なの?

 

そんな疑問を持つ方のために、この記事ではオブジェクト指向の基本から、実務やAI開発での活用例までやさしく解説します

 

オブジェクト指向とは

 

オブジェクト指向とは、簡単に言えば、現実世界のモノ(オブジェクト)をプログラムで表現する方法です。例えば、「車」というモノを考えてみましょう。

 

  • 属性(データ):色、メーカー、速度、燃料の種類など
  • 振る舞い(処理):走る、止まる、曲がる

 

このように、ひとつのモノに「情報」と「動作」がセットになっているのが現実世界の特徴です。オブジェクト指向では、これをそのままコードに落とし込みます。

 

class Car:

    def __init__(self, color, speed):

        self.color = color

        self.speed = speed

    def run(self):

        print(f”{self.color}の車が時速{self.speed}kmで走っています。”)

    def stop(self):

        print(f”{self.color}の車が止まりました。”)

 

このように、クラス(設計図)を定義し、そこから実際の車(インスタンス)を作るのが基本的な流れです。

 

Pythonにおけるクラスとインスタンスの基本構文

 

Pythonでは、class キーワードを使ってクラスを定義します。クラスは設計図インスタンスは実体です。

 

# クラス定義

class Dog:

    def __init__(self, name):

        self.name = name

    def bark(self):

        print(f”{self.name}がワンワンと吠えています!”)

# インスタンス化

my_dog = Dog(“ポチ”)

my_dog.bark()

出力:

ポチがワンワンと吠えています!

 

このように、クラスからインスタンスを生成し、メソッドを呼び出すことで、オブジェクトの動作を実現できます

 

オブジェクト指向の3つの柱を理解しよう

 

オブジェクト指向を支える3つの重要な概念を紹介します。

 

カプセル化(Encapsulation)

データと処理をひとつのクラスにまとめることで、外部から内部構造を隠し、安全性と保守性を高めます

 

class BankAccount:

    def __init__(self, owner, balance=0):

        self.__owner = owner

        self.__balance = balance

    def deposit(self, amount):

        self.__balance += amount

    def get_balance(self):

        return self.__balance

 

__balance のようにアンダースコア2つを付けることで、外部からの直接アクセスを防ぎます。

 

継承(Inheritance)

既存のクラス(親クラス)の機能を、新しいクラス(子クラス)に引き継ぐ仕組みです

 

class Animal:

    def speak(self):

        print(“何かが鳴いています”)

class Cat(Animal):

    def speak(self):

        print(“ニャー!”)

cat = Cat()

cat.speak()

出力:

ニャー!

 

親クラスの機能を再利用しつつ、必要に応じて上書き(オーバーライド)できます。

 

多態性(Polymorphism)

同じメソッド名でも、オブジェクトの種類によって異なる動作をする仕組みです

 

class Dog(Animal):

    def speak(self):

        print(“ワンワン!”)

animals = [Cat(), Dog()]

for a in animals:

    a.speak()

出力:

ニャー!

ワンワン!

 

このように、同じ speak() メソッドでも、オブジェクトの種類によって異なる動作をします。

 

実務での活用例:データ分析やAI開発におけるクラス設計

 

オブジェクト指向は、実務でも非常に役立ちます。

 

例えば、株価データを扱う場合:

 

class Stock:

    def __init__(self, symbol, prices):

        self.symbol = symbol

        self.prices = prices

    def average(self):

        return sum(self.prices) / len(self.prices)

stocks = [

    Stock(“AAPL”, [180, 182, 179]),

    Stock(“GOOG”, [125, 128, 126])

]

for stock in stocks:

    print(f”{stock.symbol}: 平均価格 = {stock.average():.2f}”)

出力:

AAPL: 平均価格 = 180.33

GOOG: 平均価格 = 126.33

 

このように、データと処理をひとつにまとめることで、コードの見通しが良くなり、再利用性も高まります

 

関数型との違いを比較してみよう

比較項目 関数型プログラミング オブジェクト指向
構造 データと処理が分離 データと処理が一体化
再利用性 関数単位で再利用 クラス単位で再利用
拡張性 手動で追加が必要 継承・多態性で柔軟に対応
規模感 小規模向き 中~大規模開発に最適

 

特にチーム開発や長期運用を前提としたプロジェクトでは、オブジェクト指向の設計が不可欠です。

 

よくある質問(Q&A)

クラスを使うと処理速度が落ちませんか

通常の開発規模であれば、クラスを使っても処理速度に大きな影響はありませんクラスはあくまで構造を整理するための仕組みであり、Pythonの実行速度を大きく左右するものではありません。

 

むしろ、クラスを使うことでコードがスッキリと整理され、保守性(メンテナンスのしやすさ)や拡張性(新しい機能を追加しやすい構造)が大きく向上します。結果的に、チーム開発や長期運用のプロジェクトでは、クラスを使った方がトータルの開発効率は高くなることがほとんどです。

 

クラスとモジュールの違いは

どちらも機能をまとめる仕組みだから同じでは?

 

と思う方も多いですが、実は役割のスコープ(範囲)が異なります

 

モジュール(module) は、「ファイル単位」で機能をまとめる仕組みです

例:preprocessing.py や model.py のような1ファイルに処理を整理します。

 

クラス(class) は、「データ構造単位」で機能をまとめます

例:Preprocessor クラスや ModelTrainer クラスなど、1つの目的や概念に基づいて設計します。

 

モジュールはファイルでまとめる箱クラスは機能を持つオブジェクトの設計図というイメージです。この違いを理解して使い分けることで、より整理されたプロジェクト構成を実現できます。

 

データクラス(@dataclass)とは

Python 3.7以降では、@dataclass という便利な機能が追加されました。これは、属性(データ)中心のクラスを簡単に定義できる構文です。

 

例えば、次のように座標(x, y)を扱うクラスを作りたいとき、通常は__init__メソッドを自分で定義する必要があります。

 

class Point:

    def __init__(self, x, y):

        self.x = x

        self.y = y

 

@dataclassを使うと、わずか数行で同じことが実現できます。

 

from dataclasses import dataclass

@dataclass

class Point:

    x: int

    y: int

 

これだけで、自動的に初期化処理や表示メソッド(__repr__)などが生成されます。データクラスを使えば、データの定義に集中でき、余計なコードを省略できるため、AI開発などで扱う設定情報やパラメータを整理するのにも最適です。

 

AI開発におけるオブジェクト指向の活用例

 

機械学習プロジェクトでは、以下のようなクラス設計がよく使われます。

 

class Preprocessor:

    def __init__(self, stopwords):

        self.stopwords = stopwords

    def clean(self, text):

        for word in self.stopwords:

            text = text.replace(word, “”)

        return text

 

このように、前処理やモデル構築、評価などの各工程をクラスとして分離することで、コードの再利用性が高まり、チーム開発にも適した構造になります。

 

まとめ

オブジェクト指向の考え方を身につけることで、Pythonは単なるスクリプト言語ではなく、チーム開発や大規模システムにも対応できる「本格的な開発ツール」へと変わります。

 

 

最初はクラスやインスタンスといった概念が抽象的に感じられるかもしれませんが、実際に手を動かしていくうちに、その便利さと再利用性の高さを実感できるはずです。もし「実際の開発でどう設計すればよいか」「自社のシステムにPythonを導入したい」など、より実践的なサポートが必要な場合は、ぜひお気軽に3inkにご相談ください。

 

 

あなたの課題やアイデアをもとに、最適なPythonシステム・ツール開発をご提案いたします。