Python初心者がはじめに学ぶべきなのはfor文でもif文でもなくオブジェクト指向という話

## 0.はじめに
現在、プログラミングの脱落率は80〜90%とも言われています。
「難しい」「意味が分からない」「エラーで詰んだ」といった理由で、多くの初学者が最初の数週間で挫折してしまいます。

その原因の多くは、「for文」や「if文」から始まる“手続き型”の学習スタイルにあります。

もちろん、それらは大切な構文です。
でも、これらを学んでもPythonが「わかる」ようにはなりません。

Pythonにおいて「for文」や「if文」は、人間で言えば行動や動作にあたります。
たとえば「歩く」「話す」「手を上げる」といった、一つひとつの具体的なアクションです。

もちろんそれらは必要です。でも、それだけを知っても“その人”を理解したことにはなりません。

本当に重要なのは、その人の「性格」や「生き方」、つまり“なぜそう動くのか”を知ること。

Pythonにおけるその考え方こそが、オブジェクト指向なのです。

本記事では、なぜオブジェクト指向を先に学ぶべきなのかを、初心者の視点に立って解説していきます。
## 1. なぜ「オブジェクト指向」から学ぶべきなのか？
### 1-1. 手続き型は“命令の羅列”に過ぎない
多くの教材は、次のようなコードから始まります。
```
for i in range(5):
    if i % 2 == 0:
        print(i, "は偶数です")
```
このコードはPythonっぽく見えるかもしれませんが、Pythonという言語が本来もっている設計哲学や強みとは、無関係です。
### 1-2. オブジェクト指向は“人格のある部品”を作る
一方、オブジェクト指向ではこう考えます。

「数値」を処理する“人”を作ろう

その人に「偶数か判定する能力」や「ログを出す能力」を持たせよう


```
class NumberAnalyzer:
    def __init__(self, number):
        self.number = number

    def is_even(self):
        return self.number % 2 == 0

    def print_info(self):
        if self.is_even():
            print(f"{self.number} は偶数です")

num = NumberAnalyzer(4)
num.print_info()

```

これは、単なる動作命令ではありません。「数値を分析する人格（NumberAnalyzer）」を設計しているのです。
この設計こそが、Pythonの本当の強みです。
Pythonは「書きやすさ」や「ライブラリの豊富さ」だけで選ばれる言語ではありません。
その本質は、「現実のものごとを“性格を持ったオブジェクト”として捉え、定義できる」という柔軟で人間的な設計思想にあります。

## 2. オブジェクト指向とは何か？
オブジェクト指向（OOP: Object-Oriented Programming）とは、
現実世界を「オブジェクト（＝モノ）」としてとらえ、それらが持つ性質（属性）や、できること（振る舞い）をセットで設計するという発想です。

たとえば「猫」を考えてみましょう。

名前がある（属性）

鳴く、歩く（振る舞い）

これをコードで表現すれば、次のようになります：
```
class Cat:
    def __init__(self, name):
        self.name = name

    def meow(self):
        print(f"{self.name} がニャーと鳴いた")

```
ここで Cat は「猫とはこういうものだ」という概念の定義です。
ミケ = Cat("ミケ") のようにすれば、「ミケという名前の猫」が生まれます。

## 3. Pythonでオブジェクトを設計する方法
オブジェクト指向を理解するための核心は、「モノを設計し、そのモノが自分で動けるようにする」という考え方です。
Pythonではこれを クラス・属性・メソッド という仕組みで実現します。




### 3-1. クラス（Class）＝「モノの設計図」
クラスとは、「こういうモノがあったらいいな」という概念の定義です。
たとえば、猫を作りたいとき、まずは「猫とは何か？」を考えるところから始まります。

```
class Cat:
    pass
```

この時点では「猫の設計図」ができただけで、まだ猫は存在していません。
でもこれがあることで、何匹でも猫を生み出せるようになります。

### 3-2. インスタンス（Instance）＝「実体化したモノ」
クラスは設計図。そこから現実に動くモノを作るのがインスタンスです。
```
mike = Cat()
```
この一行で、「ミケ」という名前の猫（オブジェクト）が生まれます。
これが「インスタンス化」と呼ばれるプロセスです。

### 3-3. 属性（Attribute）＝「モノの性質・状態」
インスタンスが持つ情報、つまりそのモノがどういう状態にあるかを表すのが「属性」です。

```
class Cat:
    def __init__(self, name, age):
        self.name = name      # 属性1：名前
        self.age = age        # 属性2：年齢
```

self.name や self.age は、その猫が持っている個別の性質です。

self は「自分自身の猫」を指します。

```
mike = Cat("ミケ", 3)
print(mike.name)  # ミケ
print(mike.age)   # 3
```
### 3-4. メソッド（Method）＝「モノができること・動作」
次に、「猫が何をできるか（＝動作）」を定義するのがメソッドです。
```
class Cat:
    def __init__(self, name, age):
        self.name = name
        self.age = age

    def meow(self):
        print(f"{self.name} がニャーと鳴いた")
```


メソッドは「猫の行動」を表します。

呼び出すと、インスタンスに応じた振る舞いをします。
```
mike = Cat("ミケ", 3)
mike.meow()  # ミケ がニャーと鳴いた
```

## 4. なぜオブジェクト指向が便利なのか？
オブジェクト指向が登場する前、プログラムはすべて「順番に並べた命令の集まり」でした。
それは、規模が大きくなるとすぐに破綻します。
```
name = "ミケ"
print(name + " がニャーと鳴いた")

name2 = "タマ"
print(name2 + " がニャーと鳴いた")
```
猫が3匹、10匹…と増えたらどうなるでしょう？
同じコードをコピーして名前を変える？
それでは管理も拡張もできません。
一方、オブジェクト指向では自由に拡張できます。
```
mike = Cat("ミケ")
tama = Cat("タマ")
hana = Cat("ハナ")

for neko in [mike, tama, hana]:
    neko.meow()
```
猫という“モノ”の定義があるから、あとは「誰が登場するか」だけを考えればよいのです。
この柔軟性が、オブジェクト指向最大の強みです。
## 5.終わりに
オブジェクト指向は、単なるコード整理のための技法ではありません。
「データ」と「そのデータに関する処理」を1つの単位（クラス）にまとめ、再利用性・拡張性・保守性を高める設計手法です。

Pythonはすべてがオブジェクトで構成されているため、クラス・属性・メソッドの理解は避けて通れません。
むしろ早い段階でこの考え方に慣れることで、後に扱うPandasやDjangoのようなライブラリも直感的に使えるようになります。