はじめに
この実験(Lab)では、Python におけるオブジェクト指向プログラミング(OOP)の基本概念を学びます。オブジェクトを作成するための設計図となるクラスの定義方法、およびクラスとオブジェクトの関係性について探求します。
定義したクラスのインスタンスを作成し、使用することで実践的な経験を積みます。この実験では、__init__ メソッドを使用してオブジェクトを初期化し初期状態を設定する方法、およびデバッグや可読性を向上させるために __repr__ メソッドを使用してオブジェクトの文字列表現をカスタマイズする方法について順を追って説明します。
クラスの定義とインスタンスの作成
このステップでは、基本的なクラスを定義し、そこからオブジェクト、すなわちインスタンスを作成する方法を学びます。
オブジェクト指向プログラミングにおいて、クラスはオブジェクトを作成するための設計図です。クラスは、作成されるオブジェクトが持つ属性(データ)とメソッド(関数)のセットを定義します。オブジェクトはクラスのインスタンスであり、クラスの設計図に基づいて構築された具体的な実体です。
まず、シンプルな Dog クラスを作成することから始めましょう。
最初に、WebIDE の左側にあるファイルエクスプローラーから dog.py ファイルを開いてください。このファイルは現在空です。
次に、Dog クラスを定義し、インスタンスを作成して使用するために、dog.py に以下のコードを追加します。
## Define a simple Dog class
class Dog:
## Class attribute
species = "Canis familiaris"
## Method
def bark(self):
print("Woof!")
## Create an instance (object) of the Dog class
my_dog = Dog()
## Access the class attribute using the instance
print(f"The species is: {my_dog.species}")
## Call the instance's method
print("The dog says:")
my_dog.bark()
コードを詳しく見ていきましょう。
class Dog:: この行はDogという名前の新しいクラスを定義します。species = "Canis familiaris": これはクラス属性です。その値はDogクラスのすべてのインスタンス間で共有されます。def bark(self):: これはメソッドを定義します。メソッドはクラス内の関数です。selfパラメータは、クラスの現在のインスタンスへの参照であり、クラスに属する変数にアクセスするために使用されます。my_dog = Dog(): この行はDogクラスの新しいインスタンスを作成し、変数my_dogに代入します。my_dog.species: ドット表記を使用してmy_dogオブジェクトのspecies属性にアクセスします。my_dog.bark():my_dogオブジェクトに対してbarkメソッドを呼び出します。Python は自動的にmy_dogオブジェクトをself引数としてメソッドに渡します。
ファイルを保存します。スクリプトを実行するには、WebIDE でターミナルを開き、以下のコマンドを実行します。
python dog.py
オブジェクトが正しく作成され、その属性とメソッドが正しくアクセスされたことを確認する、以下の出力が表示されるはずです。
The species is: Canis familiaris
The dog says:
Woof!
__init__ メソッドによるオブジェクトの初期化
クラス属性はすべてのインスタンスで共有されますが、多くの場合、各インスタンスに固有のデータを持たせたいものです。__init__ メソッドは、コンストラクタとして機能する Python クラスの特殊なメソッドです。新しいインスタンスが作成されると自動的に呼び出され、その固有の属性を初期化することができます。
各犬に固有の名前と犬種を持たせるために、Dog クラスを修正しましょう。
再度 dog.py ファイルを開き、その内容を以下のコードに置き換えてください。
## Define a Dog class with an __init__ method
class Dog:
## Class attribute
species = "Canis familiaris"
## The __init__ method (constructor)
def __init__(self, name, breed):
## Instance attributes
self.name = name
self.breed = breed
## Method
def bark(self):
print("Woof!")
## Create instances with unique attributes
dog1 = Dog("Buddy", "Golden Retriever")
dog2 = Dog("Lucy", "Labrador")
## Access the instance attributes
print(f"{dog1.name} is a {dog1.breed}.")
print(f"{dog2.name} is a {dog2.breed}.")
## The class attribute is still shared
print(f"Both are of the species: {dog1.species}")
変更点は以下の通りです。
def __init__(self, name, breed)::__init__メソッドを定義しました。これにはself、name、breedが引数として渡されます。self.name = nameおよびself.breed = breed: これらの行はインスタンス属性を作成します。これらは各Dogオブジェクト固有のものです。selfキーワードは、これらの属性を現在作成中の特定のインスタンスに結びつけます。dog1 = Dog("Buddy", "Golden Retriever"): インスタンスを作成する際、nameとbreedの引数を渡すようになりました。これらは自動的に__init__メソッドに渡されます。
ファイルを保存し、ターミナルから実行します。
python dog.py
出力は、各犬のオブジェクトが独自の名前と犬種を持っている一方で、クラス属性 species は共有されていることを示しています。
Buddy is a Golden Retriever.
Lucy is a Labrador.
Both are of the species: Canis familiaris
__repr__ によるオブジェクト表現のカスタマイズ
オブジェクトを直接 print しようとすると、Python はオブジェクトのクラスとメモリアドレスを含むデフォルトの表現を表示しますが、これはあまり役に立ちません。__repr__ という特殊なメソッドを定義することで、より説明的で開発者にとって分かりやすい文字列表現を提供できます。
Dog クラスに __repr__ メソッドを追加してみましょう。
dog.py を開き、その内容をコードの最終バージョンに置き換えてください。
## Define a Dog class with __init__ and __repr__ methods
class Dog:
## Class attribute
species = "Canis familiaris"
## The __init__ method (constructor)
def __init__(self, name, breed):
self.name = name
self.breed = breed
## The __repr__ method for a developer-friendly representation
def __repr__(self):
return f"Dog(name='{self.name}', breed='{self.breed}')"
## Method
def bark(self):
print("Woof!")
## Create an instance
my_dog = Dog("Buddy", "Golden Retriever")
## Print the object directly
print(my_dog)
主な追加点は以下の通りです。
def __repr__(self):: これは表現メソッドを定義します。return f"Dog(name='{self.name}', breed='{self.breed}')": このメソッドは文字列を返す必要があります。良い習慣として、その文字列はオブジェクトを同じ状態で再作成するために使用できる有効な Python 式のように見せることです。
ファイルを保存し、最後にスクリプトを実行します。
python dog.py
出力は、メモリアドレスの代わりに、定義した __repr__ メソッドによって返された明確で情報量の多い文字列になりました。これはデバッグに非常に役立ちます。
Dog(name='Buddy', breed='Golden Retriever')
まとめ
この実験(Lab)では、Python におけるオブジェクト指向プログラミング(OOP)の基礎を学びました。まず、シンプルなクラスを定義し、そのインスタンスを作成することで、クラス属性とメソッドの使い方を学習しました。次に、__init__ メソッドを追加して各オブジェクトに固有のインスタンス属性を初期化することで、クラスを強化しました。最後に、__repr__ メソッドを実装してオブジェクトの文字列表現をカスタマイズし、コードの明確さとデバッグ容易性を大幅に向上させました。これらの概念は、Python でより複雑で整理されたアプリケーションを構築するための基礎となります。



