my.code(); Logomy.code();
Python-5.オブジェクト指向プログラミング

my.code(); Logomy.code();

  • C++
    • 0.C++の世界へようこそ
    • 1.型システムと制御構造
    • 2.データ集合とモダンな操作
    • 3.ポインタとメモリ管理
    • 4.関数と参照渡し
    • 5.プロジェクトの分割とビルド
    • 6.クラスの基礎
    • 7.クラスを使いこなす
    • 8.継承とポリモーフィズム
    • 9.テンプレート
    • 10.STL ①:コンテナ
    • 11.STL ②:アルゴリズムとラムダ式
    • 12.RAIIとスマートポインタ
  • JavaScript
    • 0.JavaScriptへようこそ
    • 1.基本構文とデータ型
    • 2.制御構文
    • 3.関数とクロージャ
    • 4.'this'の正体
    • 5.オブジェクトとプロトタイプ
    • 6.クラス構文
    • 7.配列とイテレーション
    • 8.非同期処理①: Promise
    • 9.非同期処理②: Async/Await
  • Python
    • 0.環境構築と基本思想
    • 1.基本構文とデータ型
    • 2.リスト、タプル、辞書、セット
    • 3.制御構文と関数
    • 4.モジュールとパッケージ
    • 5.オブジェクト指向プログラミング
    • 6.ファイルの入出力とコンテキストマネージャ
    • 7.例外処理
    • 8.ジェネレータとデコレータ
  • Ruby
    • 0.rubyの世界へようこそ
    • 1.基本構文とデータ型
    • 2.制御構造とメソッド定義
    • 3.すべてがオブジェクト
    • 4.コレクション (Array, Hash, Range)
    • 5.ブロックとイテレータ
    • 6.クラスとオブジェクト
    • 7.モジュールとMix-in
    • 8.Proc, Lambda, クロージャ
    • 9.標準ライブラリの活用
    • 10.テスト文化入門
    • 11.メタプログラミング入門
  • Rust
    • 0.Rustの世界へようこそ
    • 1.基本構文と「不変性」
    • 2.関数と制御フロー
    • 3.所有権
    • 4.借用とスライス
    • 5.構造体とメソッド構文
    • 6.列挙型とパターンマッチ
    • 7.モジュールシステムとパッケージ管理
    • 8.コレクションと文字列
    • 9.エラーハンドリング
    • 10.ジェネリクスとトレイト
    • 11.ライフタイム
  • TypeScript
    • 0.TypeScriptへようこそ
    • 1.基本的な型と型推論
    • 2.オブジェクト、インターフェース、型エイリアス
    • 3.関数の型定義
    • 4.型を組み合わせる
    • 5.ジェネリクス
    • 6.クラスとアクセス修飾子
    • 7.非同期処理とユーティリティ型
my.code(); Logomy.code();

環境構築不要、その場で実践。

ut-code / my-code

Copyright © 2026 ut.code();

my.code(); について
コード実行環境についてAI質問機能についてライセンスお問い合わせ
ut.code(); について
公式ウェブサイト公式 𝕏 アカウント

第5章: Pythonicなオブジェクト指向プログラミング

Pythonのオブジェクト指向プログラミング(OOP)は、他の言語と考え方は似ていますが、よりシンプルで柔軟な構文を持っています。この章では、クラスの定義から継承、そしてPython特有の「マジックメソッド」まで、その基本を学びます。

classの定義とインスタンス化

Pythonでは、classキーワードを使ってクラスを定義します。JavaやC++のように波括弧{}は使わず、インデントでブロックを示します。非常にシンプルです。

クラスを定義したら、関数を呼び出すようにクラス名()と書くことで、そのクラスのインスタンス(オブジェクト)を生成できます。

ファイルを編集:dog1.py
class Dog:
    pass # passは何もしないことを示す文

# Dogクラスのインスタンスを作成
my_dog = Dog()

print(my_dog)
python dog1.py
ブラウザ上で動作するPython3.13.2の実行環境です。
左上の実行ボタンを押して、このページ内のdog1.pyに書かれている内容を実行します。
<__main__.Dog object at 0x10e85a4d0> 

コンストラクタ (__init__) と self

Pythonのクラスでは、__init__という名前の特殊なメソッドがコンストラクタの役割を果たします。このメソッドは、クラスがインスタンス化される際に自動的に呼び出されます。

メソッドの最初の引数にはselfを書くのが慣習です。これはインスタンス自身への参照であり、JavaやC++のthisに相当します。ただし、Pythonではselfを明示的に引数として記述する必要があります。

ファイルを編集:dog2.py
class Dog:
    # インスタンス生成時に呼び出されるコンストラクタ
    def __init__(self, name, breed):
        print(f"{name}という名前の犬が作成されました。")
        # self.変数名 の形でインスタンス変数を定義
        self.name = name
        self.breed = breed

# インスタンス化する際に__init__のself以外の引数を渡すと、
# `__init__`メソッドが `self`に`my_dog`インスタンス、`name`に`"ポチ"`、`breed`に`"柴犬"`を受け取って実行される
my_dog = Dog("ポチ", "柴犬")

# インスタンス変数にアクセス
print(f"名前: {my_dog.name}")
print(f"犬種: {my_dog.breed}")
python dog2.py
ブラウザ上で動作するPython3.13.2の実行環境です。
左上の実行ボタンを押して、このページ内のdog2.pyに書かれている内容を実行します。
ポチという名前の犬が作成されました。
名前: ポチ
犬種: 柴犬

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

Pythonのクラスには、2種類の変数があります。

  • インスタンス変数: self.変数名のように__init__内などで定義され、各インスタンスに固有の値を持ちます。上の例のnameやageがこれにあたります。
  • クラス変数: クラス定義の直下に書かれ、そのクラスから作られた全てのインスタンスで共有されます。
ファイルを編集:dog3.py
class Dog:
    # このクラスから作られるインスタンス全てで共有されるクラス変数
    species = "イヌ科"

    def __init__(self, name):
        # このインスタンス固有のインスタンス変数
        self.name = name

dog1 = Dog("ポチ")
dog2 = Dog("ハチ")

# インスタンス変数へのアクセス
print(f"{dog1.name}も{dog2.name}も、")

# クラス変数へのアクセス (インスタンス経由でもクラス経由でも可能)
print(f"種は同じく {dog1.species} です。")
print(f"Dogクラスの種は {Dog.species} です。")

# クラス変数を変更すると、全てのインスタンスに影響が及ぶ
Dog.species = "ネコ科"
print(f"{dog1.name}の種は {dog1.species}")
print(f"{dog2.name}の種は {dog2.species}")
python dog3.py
ブラウザ上で動作するPython3.13.2の実行環境です。
左上の実行ボタンを押して、このページ内のdog3.pyに書かれている内容を実行します。
ポチもハチも、
種は同じく イヌ科 です。
Dogクラスの種は イヌ科 です。
ポチの種は ネコ科
ハチの種は ネコ科

メソッドの定義

クラス内で定義される関数をメソッドと呼びます。インスタンスのデータ(インスタンス変数)を操作するために使用します。 メソッドを定義する際も、最初の引数には必ずselfを指定する必要があります。これにより、メソッド内からselfを通じてインスタンス変数にアクセスできます。

ファイルを編集:dog4.py
class Dog:
    def __init__(self, name):
        self.name = name

    # barkというメソッドを定義
    # selfを介してインスタンス変数nameにアクセスする
    def bark(self):
        return f"{self.name}: ワン!"

my_dog = Dog("ポチ")
print(my_dog.bark()) # メソッドの呼び出し
python dog4.py
ブラウザ上で動作するPython3.13.2の実行環境です。
左上の実行ボタンを押して、このページ内のdog4.pyに書かれている内容を実行します。
ポチ: ワン!

クラスメンバーの型アノテーション

型安全性を高めるために、クラス変数やインスタンス変数にも型アノテーション(型ヒント)を付けることができます。

  • クラス変数: 変数名: 型 = 値 のように記述します。
  • インスタンス変数: __init__内で self.変数名: 型 = 値 のように記述するか、クラス直下で 変数名: 型 と宣言だけしておくこともできます。
ファイルを編集:dog5.py
class Dog:
     # クラス変数の型アノテーション
    species: str = "イヌ科"

    # インスタンス変数の型を宣言
    name: str
    age: int

    def __init__(self, name: str, age: int):
        self.name = name
        self.age = age

    # メソッドの戻り値の型アノテーション
    def bark(self) -> str:
        return f"{self.name}: ワン!"

my_dog = Dog("ポチ", 3)
python dog5.py
ブラウザ上で動作するPython3.13.2の実行環境です。
左上の実行ボタンを押して、このページ内のdog5.pyに書かれている内容を実行します。

継承

あるクラスの機能を引き継いだ新しいクラスを作成することを継承と呼びます。Pythonでは、クラス定義の際に()内に親クラス(基底クラス)を指定することで継承を行います。

子クラス(派生クラス)は親クラスのメソッドや変数を全て利用でき、必要に応じて上書き(オーバーライド)することも可能です。親クラスのメソッドを呼び出したい場合はsuper()を使います。

ファイルを編集:dog6.py
# 親クラス
class Animal:
    def __init__(self, name: str):
        print("Animalの__init__が呼ばれました")
        self.name = name

    def eat(self) -> str:
         return f"{self.name}は食事中です。"

    def speak(self) -> str:
        return "..."

# Animalクラスを継承した子クラス
class Dog(Animal):
    def __init__(self, name: str, breed: str):
      print("Dogの__init__が呼ばれました")
      # super()で親クラスの__init__を呼び出し、nameを初期化
      super().__init__(name)
      self.breed = breed  # Dogクラス独自のインスタンス変数を追加

    # 親のメソッドをオーバーライド
    def speak(self) -> str:
        return f"{self.name}: ワン!"
    
    
dog = Dog("ポチ", "柴犬")

# 親クラスのメソッドも使える
print(dog.eat())
# オーバーライドしたメソッドが呼ばれる
print(dog.speak())
python dog6.py
ブラウザ上で動作するPython3.13.2の実行環境です。
左上の実行ボタンを押して、このページ内のdog6.pyに書かれている内容を実行します。
Dogの__init__が呼ばれました
Animalの__init__が呼ばれました
ポチは食事中です。
ポチ: ワン!

基本的なマジックメソッド (__str__, __repr__)

__init__のように、アンダースコア2つで囲まれた特殊なメソッドをマジックメソッド(またはダンダーメソッド)と呼びます。これらを定義することで、Pythonの組み込み関数の挙動をカスタマイズできます。

  • __str__(self)
    • print()関数やstr()でオブジェクトを文字列に変換する際に呼び出されます。
    • 目的は、人間にとって読みやすい、非公式な文字列表現を返すことです。
  • __repr__(self)
    • repr()関数で呼び出されるほか、__str__が定義されていない場合のprint()や、インタラクティブシェルでオブジェクトを評価した際に使われます。
    • 目的は、曖昧さのない、公式な文字列表現を返すことです。理想的には、その文字列を評価すると同じオブジェクトを再作成できるような表現(例: MyClass(arg1=1, arg2='B'))が望ましいです。
ファイルを編集:dog7.py
class Dog:
    def __init__(self, name, age):
        self.name = name
        self.age = age

    # print()で表示したときの振る舞いを定義
    def __str__(self):
        return f"名前: {self.name}, 年齢: {self.age}"

    # REPLでの評価やrepr()での振る舞いを定義
    def __repr__(self):
        return f"Dog(name='{self.name}', age={self.age})"

dog = Dog("ポチ", 3)

# print()は__str__を呼び出す
print(dog)

# str()も__str__を呼び出す
print(str(dog))

# repr()は__repr__を呼び出す
print(repr(dog))

# REPLやJupyter Notebookなどで変数をそのまま評価すると__repr__が表示される
# >>> dog
# Dog(name='ポチ', age=3)
python dog7.py
ブラウザ上で動作するPython3.13.2の実行環境です。
左上の実行ボタンを押して、このページ内のdog7.pyに書かれている内容を実行します。
名前: ポチ, 年齢: 3
名前: ポチ, 年齢: 3
Dog(name='ポチ', age=3)

この章のまとめ

この章では、Pythonにおけるオブジェクト指向プログラミングの基本を学びました。

  • クラスとインスタンス: classキーワードでクラスという「設計図」を定義し、クラス名()でインスタンスという「実体」を作成します。
  • __init__とself: __init__はインスタンス化の際に呼ばれるコンストラクタです。第一引数のselfはインスタンス自身を指し、self.変数名の形でインスタンスごとにユニークなインスタンス変数を定義します。
  • クラス変数: クラス直下に定義され、全てのインスタンスで共有される変数です。
  • メソッド: クラス内で定義される関数で、インスタンスの振る舞いを表します。メソッドの第一引数も必ずselfです。
  • 継承: class 子クラス(親クラス):と書くことで、親クラスの機能を引き継いだ新しいクラスを作成できます。super()を使うことで、親クラスのメソッドを呼び出せます。
  • マジックメソッド: __str__や__repr__のように__で囲まれた特殊なメソッドで、print()などの組み込み関数の挙動をカスタマイズできます。

PythonのOOPは、JavaやC++に比べてシンプルで直感的な構文が特徴です。しかし、その裏側にある「すべてがオブジェクトである」という思想は一貫しており、非常に強力なプログラミングパラダイムです。

練習問題1: Bookクラスの作成

書籍の情報を管理するBookクラスを作成してください。

要件:

  1. インスタンス化する際に、title(タイトル)とauthor(著者)を引数で受け取る。
  2. info()というメソッドを持ち、呼び出すと「{タイトル}」- {著者}という形式の文字列を返す。
  3. print()でインスタンスを直接表示した際に、info()メソッドと同じ文字列が表示されるようにする。
ファイルを編集:practice6_1.py
class Book:


if __name__ == "__main__":
    harry_potter = Book("ハリー・ポッターと賢者の石", "J.K. ローリング")
    print(harry_potter.info())
    print(harry_potter)
python practice6_1.py
ブラウザ上で動作するPython3.13.2の実行環境です。
左上の実行ボタンを押して、このページ内のpractice6_1.pyに書かれている内容を実行します。
「ハリー・ポッターと賢者の石」- J.K. ローリング
「ハリー・ポッターと賢者の石」- J.K. ローリング

練習問題2: 継承を使ったEBookクラスの作成

問題1で作成したBookクラスを継承して、電子書籍を表すEBookクラスを作成してください。

要件:

  1. Bookクラスを継承する。
  2. インスタンス化の際に、title、authorに加えてfile_size(ファイルサイズ、MB単位)も引数で受け取る。
  3. info()メソッドをオーバーライドし、呼び出すと「{タイトル}」- {著者} (ファイルサイズ: {file_size}MB)という形式の文字列を返すように変更する。
ファイルを編集:practice6_2.py
from practice6_1 import Book

class EBook(Book):
    

if __name__ == "__main__":
    ebook_version = EBook("Python実践入門", "掌田 津耶乃", 24)
    print(ebook_version.info())
python practice6_2.py
ブラウザ上で動作するPython3.13.2の実行環境です。
左上の実行ボタンを押して、このページ内のpractice6_2.pyに書かれている内容を実行します。
「Python実践入門」- 掌田 津耶乃 (ファイルサイズ: 24MB)
前のページ« モジュールとパッケージ
次のページファイルの入出力とコンテキストマネージャ »