はじめに
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 |