はじめに
この実験では、Python のクラスとインスタンスを探索し、オブジェクトがクラスのインスタンスであるかどうかを確認する方法を学びます。まず、クラス属性とインスタンス属性を持つ Dog クラスを作成し、次に Dog クラスのインスタンスを作成してそれらの属性にアクセスします。
次に、型チェックに isinstance() を使用する方法を学び、正確な一致を確認する type() と比較します。これにより、オブジェクトが特定のクラスまたはそのサブクラスに属しているかどうかを判断でき、Python のオブジェクト指向プログラミングについてより深い理解が得られます。
クラスとインスタンスの探索
このステップでは、Python のクラスとインスタンスについて学びます。クラスはオブジェクトを作成するための設計図のようなもので、インスタンスはその設計図から作成された実際のオブジェクトです。クラスとインスタンスを理解することは、Python のオブジェクト指向プログラミングの基礎です。
まず、Dog という簡単なクラスを作成しましょう。
LabEx 環境で VS Code エディタを開きます。
~/projectディレクトリにdog.pyという名前の新しいファイルを作成します。~/project/dog.pydog.pyに以下のコードを追加します。## Define a class called Dog class Dog: ## Class attribute species = "Canis familiaris" ## Instance attribute def __init__(self, name, age): self.name = name self.age = ageここでは、
Dogという名前のクラスを定義しています。speciesはクラス属性で、Dogクラスのすべてのインスタンスによって共有されます。__init__メソッドはコンストラクタと呼ばれる特別なメソッドです。新しいDogオブジェクトが作成されるときに、インスタンス属性nameとageを初期化するために使用されます。次に、
Dogクラスのインスタンスを作成しましょう。dog.pyの末尾に以下のコードを追加します。## Create instances of the Dog class buddy = Dog("Buddy", 9) miles = Dog("Miles", 4) ## Access instance attributes print(f"{buddy.name} is {buddy.age} years old.") print(f"{miles.name} is {miles.age} years old.") ## Access class attribute print(f"{buddy.name} is a {buddy.species}.") print(f"{miles.name} is a {miles.species}.")この部分では、
Dogクラスの 2 つのインスタンスbuddyとmilesを作成しています。その後、ドット記法 (.) を使用して、それらのインスタンス属性 (nameとage) およびクラス属性 (species) にアクセスしています。dog.pyスクリプトを実行するには、VS Code でターミナルを開き、以下のコマンドを実行します。python dog.py以下の出力が表示されるはずです。
Buddy is 9 years old. Miles is 4 years old. Buddy is a Canis familiaris. Miles is a Canis familiaris.この出力は、
Dogクラスのインスタンスを正常に作成し、それらの属性にアクセスできたことを確認しています。
isinstance() を使用した型チェック
このステップでは、Python の isinstance() 関数を使用して、オブジェクトが特定のクラスのインスタンスであるかどうかを確認する方法を学びます。これは、コードがさまざまな型のオブジェクトを正しく処理することを保証するための便利なツールです。
前のステップで作成した Dog クラスを基に、isinstance() を探索するための新しい Python ファイルを作成しましょう。
LabEx 環境で VS Code エディタを開きます。
~/projectディレクトリにtype_check.pyという名前の新しいファイルを作成します。~/project/type_check.pydog.pyからDogクラスの定義をコピーして、type_check.pyに貼り付けます。この時点でのtype_check.pyファイルは次のようになります。class Dog: species = "Canis familiaris" def __init__(self, name, age): self.name = name self.age = age次に、
isinstance()関数を使用するコードを追加しましょう。type_check.pyの末尾に以下のコードを追加します。## Create instances of the Dog class buddy = Dog("Buddy", 9) miles = Dog("Miles", 4) ## Check if buddy is an instance of the Dog class print(isinstance(buddy, Dog)) ## Check if miles is an instance of the Dog class print(isinstance(miles, Dog)) ## Check if a string is an instance of the Dog class print(isinstance("Hello", Dog))ここでは、
Dogクラスの 2 つのインスタンスbuddyとmilesを作成しています。その後、isinstance()関数を使用して、これらのインスタンスがDog型であるかどうかを確認しています。また、文字列 "Hello" がDogクラスのインスタンスであるかどうかも確認しています。type_check.pyスクリプトを実行するには、VS Code でターミナルを開き、以下のコマンドを実行します。python type_check.py以下の出力が表示されるはずです。
True True Falseこの出力は、
buddyとmilesが確かにDogクラスのインスタンスであり、文字列 "Hello" はそうではないことを示しています。
type() を使用した正確な型の比較
このステップでは、Python の type() 関数の使い方を学び、型チェックにおける isinstance() との違いを比較します。isinstance() はオブジェクトがあるクラスまたはそのサブクラスのインスタンスであるかをチェックしますが、type() はオブジェクトの正確な型を返します。
この違いを説明するために、Dog クラスのサブクラスを作成し、isinstance() と type() の両方を使ってインスタンスの型をチェックしましょう。
LabEx 環境で VS Code エディタを開きます。
~/projectディレクトリ内のtype_check.pyファイルを編集します。~/project/type_check.pyDogクラスを継承するGermanShepherdという新しいクラスを追加します。この時点でのtype_check.pyファイルは次のようになります。class Dog: species = "Canis familiaris" def __init__(self, name, age): self.name = name self.age = age class GermanShepherd(Dog): def __init__(self, name, age, training_level): super().__init__(name, age) self.training_level = training_levelここで、
GermanShepherdはDogのサブクラスです。Dogクラスからnameとage属性を継承し、新しい属性training_levelを追加しています。次に、
isinstance()とtype()関数を使用するコードを追加しましょう。type_check.pyの末尾に以下のコードを追加します。## Create instances of the Dog and GermanShepherd classes buddy = Dog("Buddy", 9) sparky = GermanShepherd("Sparky", 3, "Advanced") ## Check types using isinstance() print(f"buddy isinstance Dog: {isinstance(buddy, Dog)}") print(f"sparky isinstance Dog: {isinstance(sparky, Dog)}") print(f"sparky isinstance GermanShepherd: {isinstance(sparky, GermanShepherd)}") ## Check types using type() print(f"type(buddy) == Dog: {type(buddy) == Dog}") print(f"type(sparky) == Dog: {type(sparky) == Dog}") print(f"type(sparky) == GermanShepherd: {type(sparky) == GermanShepherd}")この部分では、
Dogクラスのインスタンス (buddy) とGermanShepherdクラスのインスタンス (sparky) を作成しています。その後、isinstance()とtype()を使ってそれらの型をチェックしています。type_check.pyスクリプトを実行するには、VS Code でターミナルを開き、以下のコマンドを実行します。python type_check.py以下の出力が表示されるはずです。
buddy isinstance Dog: True sparky isinstance Dog: True sparky isinstance GermanShepherd: True type(buddy) == Dog: True type(sparky) == Dog: False type(sparky) == GermanShepherd: Trueこの出力は、
isinstance(sparky, Dog)がTrueを返すのは、sparkyがDogのサブクラスであるGermanShepherdクラスのインスタンスであるからです。しかし、type(sparky) == DogはFalseを返します。なぜならtype(sparky)は正確な型であるGermanShepherdを返し、Dogではないからです。
まとめ
この実験では、Python のクラスとインスタンスの基本を学びました。__init__ コンストラクタ内で初期化されるクラス属性とインスタンス属性を含むクラスの定義方法を学びました。
その後、Dog クラスのインスタンスを作成し、それぞれの属性に値を割り当てました。最後に、ドット表記を使用してインスタンス属性(名前、年齢)とクラス属性(種)の両方にアクセスし、オブジェクトとそのクラスに関連付けられた情報を取得する方法を実証しました。



