Pythonクラス入門:オブジェクト指向の基本をわかりやすく解説
Pythonのクラスとオブジェクト指向を初心者向けに解説。selfや__init__、継承などを実例で学べる入門記事。
はじめに
Pythonはオブジェクト指向言語であり、クラスを使うことでコードの再利用性や保守性を高められます。この記事では、Pythonのクラスの基本から、self、__init__、継承までを実践的な例とともに解説します。
クラスとは
クラスはオブジェクトの設計図です。同じ属性やメソッドを持つオブジェクトを効率的に生成できます。
クラスの定義
class Dog:
pass
passは何もしない文です。後で中身を追加します。
インスタンスの生成
dog1 = Dog()
print(dog1) # <__main__.Dog object at 0x...>
__init__メソッド:コンストラクタ
インスタンス生成時に自動的に呼ばれるメソッドです。初期化に使います。
class Dog:
def __init__(self, name, age):
self.name = name
self.age = age
dog1 = Dog("ポチ", 3)
print(dog1.name) # ポチ
selfパラメータ
selfはインスタンス自身を指します。メソッドの第一引数として必ず書きます。
class Dog:
def __init__(self, name):
self.name = name
def bark(self):
print(f"{self.name}がワン!")
dog1 = Dog("ポチ")
dog1.bark() # ポチがワン!
メソッドの追加
クラスには自由にメソッドを追加できます。
class Dog:
def __init__(self, name, age):
self.name = name
self.age = age
def human_age(self):
return self.age * 7
def info(self):
print(f"名前: {self.name}, 年齢: {self.age}歳")
dog1 = Dog("ポチ", 3)
dog1.info() # 名前: ポチ, 年齢: 3歳
print(dog1.human_age()) # 21
クラス変数とインスタンス変数
クラス変数は全インスタンスで共有、インスタンス変数は各インスタンス固有です。
class Dog:
species = "イヌ" # クラス変数
def __init__(self, name):
self.name = name # インスタンス変数
dog1 = Dog("ポチ")
dog2 = Dog("タロ")
print(dog1.species) # イヌ
print(dog2.species) # イヌ
Dog.species = "犬"
print(dog1.species) # 犬
継承
既存のクラスを基に新しいクラスを作れます。親クラスの機能を引き継ぎ、拡張できます。
class Animal:
def __init__(self, name):
self.name = name
def speak(self):
pass
class Dog(Animal):
def speak(self):
return f"{self.name}がワン!"
class Cat(Animal):
def speak(self):
return f"{self.name}がニャー!"
dog = Dog("ポチ")
cat = Cat("タマ")
print(dog.speak()) # ポチがワン!
print(cat.speak()) # タマがニャー!
super()で親クラスのメソッドを呼ぶ
class Dog(Animal):
def __init__(self, name, breed):
super().__init__(name) # 親の__init__を呼ぶ
self.breed = breed
def speak(self):
return f"{self.name}({self.breed})がワン!"
dog = Dog("ポチ", "柴犬")
print(dog.speak()) # ポチ(柴犬)がワン!
特殊メソッド
__str__や__repr__など、ダブルアンダースコアで囲まれたメソッドです。
class Dog:
def __init__(self, name):
self.name = name
def __str__(self):
return f"Dog(name={self.name})"
def __repr__(self):
return f"Dog('{self.name}')"
dog = Dog("ポチ")
print(dog) # Dog(name=ポチ)
print(repr(dog)) # Dog('ポチ')
カプセル化
属性を外部から直接変更できないようにする技法です。Pythonでは慣習的にアンダースコアで保護します。
class Dog:
def __init__(self, name):
self._name = name # 保護属性(慣習)
def get_name(self):
return self._name
def set_name(self, name):
if name:
self._name = name
dog = Dog("ポチ")
print(dog.get_name()) # ポチ
dog.set_name("タロ")
print(dog.get_name()) # タロ
プロパティ
@propertyデコレータを使うと、メソッドを属性のように扱えます。
class Dog:
def __init__(self, name):
self._name = name
@property
def name(self):
return self._name
@name.setter
def name(self, value):
if value:
self._name = value
dog = Dog("ポチ")
print(dog.name) # ポチ
dog.name = "タロ"
print(dog.name) # タロ
まとめ
Pythonのクラスは、__init__での初期化、selfによるインスタンス操作、継承による拡張が基本です。これらの概念をマスターすれば、より大規模で保守性の高いコードが書けるようになります。ぜひ実際にコードを書いて練習してみてください。