Why not login to Qiita and try out its useful features?

We'll deliver articles that match you.

You can read useful information later.

44
29

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

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

Last updated at Posted at 2025-05-07

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のようなライブラリも直感的に使えるようになります。

44
29
3

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
Linked from these articles

Comments

tknakamuri
@tknakamuri

なんか極端ですね。

オブジェクト指向はずっと後で良いですよ。最初は簡単な道具を使うことから始めるべき。

1
utsumi2024
@utsumi2024
(Edited)

Pythonは好きではありませんが、初心者がforやifから学ぶべきでは無いというのは実は私も思っています。
ただ自分はforやifから実際に学んだ後にそう思ったので、完全にこのプログラムの基本構造の2要素(ifとfor)を除外して学び始めたら本当はそう思わないかもしれないとおもっています。

とにかく順次処理だけで良いと思っていますし、forやifで混乱する初学者を腐るほど見てきました。
繰り返したいと思った時、分岐したいと思った時に初めて学べばいい概念であって、forやifの理解を深めるためにアルゴリズムの勉強をしましょうは言語道断だと思っています。

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

間違ってます
Pythonは全てがオブジェクトであるため、その時点で猫は存在しています(実際に動的に定義を変更できてしまいます)
Pythonはこういう言語設計だから好きじゃないんですよね。

Pythonは「書きやすさ」や「ライブラリの豊富さ」だけで選ばれる言語ではありません。

ライブラリの豊富さだけで選ばれる言語でしょう。
ライブラリの豊富さを取ったら何も残りません。

オブジェクト指向は、単なるコード整理のための技法ではありません。
「データ」と「そのデータに関する処理」を1つの単位(クラス)にまとめ、再利用性・拡張性・保守性を高める設計手法です。

オブジェクト指向の本質はオブジェクトが名前空間(まとまりのホルダー)でしかないこと、定義的に抽象化可能なところだと思います。
(Pythonでは型安全に抽象化出来ませんけどね)

再利用性、拡張性、保守性を高めたいのであれば関数型プログラミングに度肝を抜かすと思います。

0
@shori2912

まず、前提として、Pythonは動的型付けに加えインタープリタ言語として構文が最適化されており、プライベートメンバにアクセス可能であったり、またRustのようなパラメトリック多相性などのOOPを強化する表現力をサポートしていない言語であります。

  1. なぜ「オブジェクト指向」から学ぶべきなのか?
    1-1. 手続き型は“命令の羅列”に過ぎない

言語処理系そのものは、プログラミング言語をかなり大雑把にみるなら、以下のように扱います。

  • 命令(ISA)及びプログラムローダが読み込む、オブジェクトファイルフォーマットの抽象からのcode generator としての役割(狭義のコンパイラ?)
  • ASTのTree-walkによる解釈実行、スタック型言語の解析実行、VM型言語のバイトコードをcodegen、処理するシステム(インタープリタ)

であって、コンピューターは命令を処理するものです。

その原因の多くは、「for文」や「if文」から始まる“手続き型”の学習スタイルにあります。
もちろん、それらは大切な構文です。
でも、これらを学んでもPythonが「わかる」ようにはなりません。
Pythonにおいて「for文」や「if文」は、人間で言えば行動や動作にあたります。
たとえば「歩く」「話す」「手を上げる」といった、一つひとつの具体的なアクションです。

逆に、構造化プログラミングをまだ理解していない人に Pythonを含むプログラミング言語 を理解することは"非常に困難"でありますが、構造化プログラミングのとっつきやすさを超えた、オブジェクト指向を導入とする初心者への説明が可能なら、それは成り立ちます。

多くの教材は、次のようなコードから始まります。

for i in range(5):
    if i % 2 == 0:
        print(i, "は偶数です")

このコードはPythonっぽく見えるかもしれませんが、Pythonという言語が本来もっている設計哲学や強みとは、無関係です。

ここで、主張の本筋とはずれますが、日本語を幼児により理解させるために、多言語と比べた日本語の強みをプレゼンする必要はないですね。

オブジェクト指向(OOP: Object-Oriented Programming)とは、
現実世界を「オブジェクト(=モノ)」としてとらえ、それらが持つ性質(属性)や、できること(振る舞い)をセットで設計するという発想です。
たとえば「猫」を考えてみましょう。

オブジェクト指向プログラミングとは、原義(アラン・ケイ)を尊重するなら、オブジェクト同士のメッセージパッシングであり、現代のプログラミング言語では、以下のリストのように、オブジェクト同士の関係を作っていき、より保守性の高いプログラムを書くプログラミング手法です。

  • アクセス修飾子
  • has - a 関係
  • is - a関係
  • トレイト・インターフェースによるアンチパターンを回避した設計

など

1-2. オブジェクト指向は“人格のある部品”を作る
一方、オブジェクト指向ではこう考えます。
「数値」を処理する“人”を作ろう
その人に「偶数か判定する能力」や「ログを出す能力」を持たせよう

OOPで言語処理系を書く際には、コンパイラやその構成要素であるLexer・Parser・Resolver・Interner・Sessionなどを現実世界のオブジェクトとしてとらえ、それに人格を与える行為であるとは、少なくとも私がしてきたプログラミングとは乖離があります。
(猫などに"人格"を付与するプログラミングが、OOP的にいい設計とは限りませんし、保守性や可読性を高めるプログラミングとしては個人的にはズレを感じます)

オブジェクト指向が登場する前、プログラムはすべて「順番に並べた命令の集まり」でした。
それは、規模が大きくなるとすぐに破綻します。

name = "ミケ"
print(name + " がニャーと鳴いた")
name2 = "タマ"
print(name2 + " がニャーと鳴いた")

猫が3匹、10匹…と増えたらどうなるでしょう?
同じコードをコピーして名前を変える?
それでは管理も拡張もできません。
一方、オブジェクト指向では自由に拡張できます。

命令型言語・構造化プログラミングが規模が大きくなるにつれ、完全に破綻してしまうなら、どうやって人類は最初のOOP言語をブートストラップ(C言語などでOOP言語をコンパイル)したのか疑ってしまうような、誤解を生む可能性のある意見だと思います。
(Python標準の処理系である、一番よく使われているCPythonも、C言語で書かれていますし、今もPythonを動かせるように、何年もおそらく破綻していません) (Python理事会は除いて)

むしろ Python の強みは、記法のシンプルさや開発の速さ、パッケージの多さ、データサイエンスなどに簡単に取り組めることにあります。
OOPの表現力としては、ダイヤモンド継承問題を回避するためにクラスを削除しトレイトベースOOPを導入したり、強力な型付けによるパラメトリック多相性、関連型をよく組み込んでいる言語の方が強力ではあります。
ただ、そのOOPをPythonの強みとして伝え、初心者により理解しやすい方法とするのは、実際のソフトウェア開発との乖離があるように感じました。

私はPythonは初心者のとき最初に触れたっきり縁がないですが、この記事をきっかけに、Pythonの学習方法について、多様な意見が交わされることを期待します。

0

Let's comment your feelings that are more than good

44
29

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Login to continue?

Login or Sign up with social account

Login or Sign up with your email address