Python - クラスとオブジェクト
こんにちは、Pythonプログラマー志望の皆さん!今日、私たちはPythonでのオブジェクト指向プログラミング(OOP)のワクワクする冒険に出かけます。シートベルトを締めて、コードに対する考え方を変える旅に出よう!
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
は私たちのクラスです。name
やbreed
のような属性があり、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