オブジェクト指向プログラミング
データとメソッドをまとめたテンプレート。
クラスの基本
なぜクラスが必要か?
クラスは、データとメソッドをまとめるのに適しています。オブジェクト指向プログラミングの基礎で、コードの再利用性を向上できます。
いつ使うか?
- データとメソッドをまとめる場合
- オブジェクト指向プログラミングを行う場合
- コードの再利用性を向上する場合
- 複雑なデータ構造を扱う場合
実践テクニック
__init__を使う
__init__を使うことで、オブジェクトの初期化を行えます。これにより、オブジェクト作成時に属性を設定できます。
selfを使う
selfを使うことで、インスタンス自身を参照できます。これにより、インスタンスの属性やメソッドにアクセスできます。
# クラスの基本class Person: def __init__(self, name, age): self.name = name self.age = age
def greet(self): print(f"Hello, my name is {self.name}")
def introduce(self): print(f"I am {self.age} years old")
# インスタンスの作成person = Person("Alice", 25)person.greet() # Hello, my name is Aliceperson.introduce() # I am 25 years old継承
なぜ継承が必要か?
継承は、親クラスの機能を子クラスに引き継ぐのに適しています。これにより、コードの再利用性を向上できます。
いつ使うか?
- 親クラスの機能を引き継ぐ場合
- コードの再利用性を向上する場合
- クラス間の関係を表現する場合
- 共通の機能を共有する場合
実践テクニック
super()を使う
super()を使うことで、親クラスのメソッドを呼び出すことができます。これにより、親クラスの機能を拡張できます。
メソッドのオーバーライドを使う
メソッドのオーバーライドを使うことで、親クラスのメソッドを再定義できます。これにより、子クラス独自の動作を実装できます。
# 継承の基本class Animal: def __init__(self, name): self.name = name
def speak(self): print(f"{self.name} makes a sound")
class Dog(Animal): def speak(self): print(f"{self.name} barks")
class Cat(Animal): def speak(self): print(f"{self.name} meows")
# インスタンスの作成dog = Dog("Buddy")cat = Cat("Whiskers")dog.speak() # Buddy barkscat.speak() # Whiskers meowsポリモーフィズム
なぜポリモーフィズムが必要か?
ポリモーフィズムは、異なるオブジェクトを同じインターフェースで扱うのに適しています。これにより、コードの柔軟性を向上できます。
いつ使うか?
- 異なるオブジェクトを同じインターフェースで扱う場合
- コードの柔軟性を向上する場合
- 汎用的なコードを書く場合
- 異なる型のオブジェクトを統一的に扱う場合
実践テクニック
メソッドのオーバーロードを使う
メソッドのオーバーロードを使うことで、同じ名前のメソッドを異なる引数で定義できます。これにより、コードの可読性を向上できます。
ダックタイピングを使う
ダックタイピングを使うことで、オブジェクトの型を気にせずにメソッドを呼び出すことができます。これにより、コードの柔軟性を向上できます。
# ポリモーフィズムの基本class Shape: def area(self): pass
class Rectangle(Shape): def __init__(self, width, height): self.width = width self.height = height
def area(self): return self.width * self.height
class Circle(Shape): def __init__(self, radius): self.radius = radius
def area(self): return 3.14159 * self.radius ** 2
# インスタンスの作成shapes = [Rectangle(5, 10), Circle(7)]for shape in shapes: print(f"Area: {shape.area()}")カプセル化
なぜカプセル化が必要か?
カプセル化は、データとメソッドを隠蔽して、外部からの直接アクセスを制限するのに適しています。これにより、データの整合性を保護できます。
いつ使うか?
- データとメソッドを隠蔽する場合
- 外部からの直接アクセスを制限する場合
- データの整合性を保護する場合
- インターフェースを簡潔にする場合
実践テクニック
プライベート属性を使う
プライベート属性(__)を使うことで、外部からの直接アクセスを制限できます。これにより、データの整合性を保護できます。
プロパティを使う
プロパティ(@property)を使うことで、属性へのアクセスを制御できます。これにより、データの整合性を保護しつつ、柔軟なアクセスを提供できます。
# カプセル化の基本class BankAccount: def __init__(self, balance): self.__balance = balance # プライベート属性
def deposit(self, amount): self.__balance += amount
def withdraw(self, amount): if amount > self.__balance: raise ValueError("Insufficient funds") self.__balance -= amount
def get_balance(self): return self.__balance
# インスタンスの作成account = BankAccount(1000)account.deposit(500)print(account.get_balance()) # 1500account.withdraw(300)print(account.get_balance()) # 1200合格ライン
演習課題
参考文献
この記事は以下の公的ガイドライン/標準に基づいています。
- Classes - Python Tutorial - 公式ドキュメント
- Data Model - Python Reference - 公式ドキュメント