Python におけるクラスとオブジェクトの定義

PythonBeginner
オンラインで実践に進む

はじめに

この実験(Lab)では、Python におけるオブジェクト指向プログラミング(OOP)の基本概念を学びます。オブジェクトを作成するための設計図となるクラスの定義方法、およびクラスとオブジェクトの関係性について探求します。

定義したクラスのインスタンスを作成し、使用することで実践的な経験を積みます。この実験では、__init__ メソッドを使用してオブジェクトを初期化し初期状態を設定する方法、およびデバッグや可読性を向上させるために __repr__ メソッドを使用してオブジェクトの文字列表現をカスタマイズする方法について順を追って説明します。

これは Guided Lab です。学習と実践を支援するためのステップバイステップの指示を提供します。各ステップを完了し、実践的な経験を積むために、指示に注意深く従ってください。過去のデータによると、この 初級 レベルの実験の完了率は 94%です。学習者から 100% の好評価を得ています。

クラスの定義とインスタンスの作成

このステップでは、基本的なクラスを定義し、そこからオブジェクト、すなわちインスタンスを作成する方法を学びます。

オブジェクト指向プログラミングにおいて、クラスはオブジェクトを作成するための設計図です。クラスは、作成されるオブジェクトが持つ属性(データ)とメソッド(関数)のセットを定義します。オブジェクトはクラスのインスタンスであり、クラスの設計図に基づいて構築された具体的な実体です。

まず、シンプルな 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__ メソッドを定義しました。これには selfnamebreed が引数として渡されます。
  • self.name = name および self.breed = breed: これらの行はインスタンス属性を作成します。これらは各 Dog オブジェクト固有のものです。self キーワードは、これらの属性を現在作成中の特定のインスタンスに結びつけます。
  • dog1 = Dog("Buddy", "Golden Retriever"): インスタンスを作成する際、namebreed の引数を渡すようになりました。これらは自動的に __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 でより複雑で整理されたアプリケーションを構築するための基礎となります。