0
0

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】Pythonでオブジェクト指向プログラミング(OOP)

Last updated at Posted at 2025-11-24

はじめに

Python の OOP(オブジェクト指向)は、Java や C# のような堅さがなく、やわらかい書き心地が特徴です。
一度コツをつかむと、「え、こんなにシンプルでいいの?」と思うほど使いやすい世界が広がります。

この記事では、Python の OOP の本質を、必要なところだけキュッとまとめつつ、実務でそのまま使える形で解説します。


1. OOPとは?

ざっくり言うと:

現実世界の“モノ(オブジェクト)”をコードで表現するための考え方。

オブジェクトは

  • 属性(データ)
  • メソッド(振る舞い)
    を持ちます。

Python は「何でもオブジェクト」で、基本の型(int, str…)ですらオブジェクト。
とても“オブジェクトフレンドリーな言語”なんですね。


2. クラスとインスタンス

Python の class 定義は驚くほどシンプルです。

class Person:
    pass

インスタンス化すると “人が誕生” します。

p = Person()

Java のような new も不要。軽やか。


3. __init__

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

__init__ は“生まれた直後に呼ばれる初期化処理”。
self は “自分自身を指すもの” です。


4. self が必要な理由

Python はメソッドを呼び出すたびに、自動でインスタンス自身を渡します。

p.say()

これは実際には:

Person.say(p)

の糖衣構文です。
だから メソッド定義には必ず self が必要


5. インスタンス属性 vs クラス属性

インスタンス属性(個別データ)

self.name = name

クラス属性(全インスタンス共通)

class Dog:
    species = "Canis familiaris"  # クラス属性

インスタンスからもアクセスできるけど、全員同じ値を共有します。


6. メソッドの種類

Python には3種類のメソッドがあります。

① インスタンスメソッド(最頻出)

def bark(self):
    print("Bow wow!")

② クラスメソッド(cls)

@classmethod
def from_name(cls, name):
    return cls(name)

③ スタティックメソッド(引数なし)

@staticmethod
def add(a, b):
    return a + b

7. 継承(Inheritance)

親クラスの機能を子クラスに引き継げます。

class Animal:
    def speak(self):
        print("Animal sound")

class Dog(Animal):
    def speak(self):
        print("Bow wow!")

super() で親クラスのメソッドも呼べます。

super().speak()

8. カプセル化(Encapsulation)

Python は“ほどほどに自由”な言語なので、
Java のような強制的な private はありません。

慣習的な保護レベル:

  • _name → 保護(protected 的)
  • __name → 名前マングリング(private 的)
self.__secret = "秘密"

実際には _ClassName__secret に変換されます。


9. 多態(Polymorphism)

Python は「ダックタイピング」が得意。

「アヒルみたいに歩いて、アヒルみたいに鳴けば、それはアヒル」

つまり、クラスが違っても同じメソッド名があれば使える。

class Cat:
    def speak(self): return "Meow"

class Dog:
    def speak(self): return "Bow wow"

def talk(animal):
    print(animal.speak())

10. プロパティ(@property

Java の setter/getter より100倍スマート!

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

    @property
    def age(self):
        return self._age

    @age.setter
    def age(self, value):
        if value < 0:
            raise ValueError("年齢は0以上ですよ!")
        self._age = value

使う側は:

p.age      # getter
p.age = 20 # setter

シンプルで気持ち良い。


11. サンプル

銀行口座クラス(クラス属性 + property + メソッド)

class BankAccount:
    interest_rate = 0.03   # クラス属性(全口座共通)

    def __init__(self, owner, balance):
        self.owner = owner
        self._balance = balance

    @property
    def balance(self):
        return self._balance

    def deposit(self, amount):
        self._balance += amount

    @classmethod
    def set_rate(cls, rate):
        cls.interest_rate = rate

まとめ

Python の OOP は以下をおさえれば完璧です。

概念 説明
クラス class で定義する
インスタンス obj = Class()
コンストラクタ __init__
self インスタンス自身
クラス属性 全インスタンス共有
インスタンス属性 各インスタンス固有
継承 class A(B)
多態 ダックタイピング
カプセル化 _name, __name
property 綺麗な getter/setter

0
0
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
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?