Python - クラスとオブジェクト

こんにちは、Pythonプログラマー志望の皆さん!今日、私たちはPythonでのオブジェクト指向プログラミング(OOP)のワクワクする冒険に出かけます。シートベルトを締めて、コードに対する考え方を変える旅に出よう!

Python - Classes & Objects

Pythonでのクラスとは?

仮想動物園を構築していると仮定しましょう。それぞれの動物を一から作り出すわけにはいきませんよね?そんなときにクラスは便利になります!

Pythonのクラスは、オブジェクトを作成するための青本やテンプレートのようなものです。それは、そのクラスのオブジェクトが持つ属性とメソッドの集合を定義します。

シンプルなクラスを作成して犬を表現してみましょう:

class Dog:
def __init__(self, name, breed):
self.name = name
self.breed = breed

def bark(self):
print(f"{self.name} says Woof!")

この例では、Dogは私たちのクラスです。namebreedのような属性があり、bark()というメソッドがあります。

Pythonでのクラスの作成

クラスを作るのは、classキーワードにクラス名を続けるだけで簡単です。もっと詳細なCarクラスを作成してみましょう:

class Car:
def __init__(self, make, model, year):
self.make = make
self.model = model
self.year = year
self.odometer = 0

def drive(self, distance):
self.odometer += distance
print(f"Drove {distance} miles. Total: {self.odometer} miles")

def honk(self):
print("Beep beep!")

ここで、__init__は特別なメソッドで、コンストラクタと呼ばれます。これは、このクラスの新しいオブジェクトを作成したときに呼ばれます。

オブジェクトとは?

クラスが青本であれば、オブジェクトはその青本から作られた実際の「物」です。それは、クラスの特定のインスタンスです。

Pythonでのクラスオブジェクトの作成

オブジェクトを作る(インスタンス化とも呼ばれます)ことは、青本を使って何か実際のものを作るようなものです。いくつかの車を作成してみましょう:

my_car = Car("Toyota", "Corolla", 2020)
your_car = Car("Honda", "Civic", 2019)

print(my_car.make)  # 出力: Toyota
your_car.drive(50)  # 出力: Drove 50 miles. Total: 50 miles
my_car.honk()  # 出力: Beep beep!

それぞれの車は、独自の属性とメソッドを持つ別々のオブジェクトです。

Pythonでのオブジェクトの属性へのアクセス

オブジェクトの属性にはドット記法を使ってアクセスできます。私たちの車を調べてみましょう:

print(f"My car is a {my_car.year} {my_car.make} {my_car.model}")
# 出力: My car is a 2020 Toyota Corolla

Pythonクラスの内蔵クラス属性

Pythonのクラスには、いくつかの内蔵属性があります。それらを探ってみましょう:

class MyClass:
x = 5

print(MyClass.__name__)  # 出力: MyClass
print(MyClass.__module__)  # 出力: __main__
print(MyClass.__dict__)  # 出力: {'__module__': '__main__', 'x': 5, ...}

Pythonデータ型の内蔵クラス

知っているでしょうか、基本的なPython型もオブジェクトです。見てみましょう:

print(type(5))  # 出力: <class 'int'>
print(type("Hello"))  # 出力: <class 'str'>
print(type([1, 2, 3]))  # 出力: <class 'list'>

Pythonのすべてはオブジェクトです!

Pythonでのガーベジコレクション(オブジェクトの破棄)

Pythonでは、オブジェクトを手動で破棄する必要はありません。Pythonのガーベジコレクターは、オブジェクトがもはや使用されていないときに自動的に処理します。

import gc

# オブジェクトを作成
my_car = Car("Toyota", "Corolla", 2020)

# リファレンスを削除
my_car = None

# ガーベジコレクションを強制(通常は必要ありません)
gc.collect()

Pythonでのデータ隠蔽

OOPでは、特定の属性へのアクセスを制御したいことがよくあります。Pythonでは、属性名の前にアンダースコアを付ける慣習を使います:

class BankAccount:
def __init__(self, balance):
self._balance = balance  # 保護された属性
self.__secret = "shh"  # プライベート属性

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

def get_balance(self):
return self._balance

account = BankAccount(1000)
print(account._balance)  # 出力: 1000(しかし、これは行うべきではありません!)
print(account.__secret)  # これはAttributeErrorを引き起こします

以下は、私たちがカバーしたメソッドをまとめた表です:

メソッド 説明
__init__(self, ...) コンストラクタメソッド、新しいオブジェクトを作成したときに呼ばれます
__str__(self) オブジェクトの文字列表現を返します
__repr__(self) オブジェクトの詳細な文字列表現を返します
__len__(self) 内蔵のlen()関数の動作を定義します
__getitem__(self, key) インデックス操作の動作を定義します
__setitem__(self, key, value) インデックス付きの値への割り当ての動作を定義します

それでは、これでお終いです!Pythonでのオブジェクト指向プログラミングの世界に踏み込む第一歩をお取りでしょうね。覚えておいてください、練習は成功の一部です。自分のクラスとオブジェクトを作ってみて、まもなくプロのように複雑で効率的なプログラムを構築できるようになります!

Credits: Image by storyset