Python でオブジェクトがクラスのインスタンスであるかを確認する方法

PythonPythonBeginner
今すぐ練習

💡 このチュートリアルは英語版からAIによって翻訳されています。原文を確認するには、 ここをクリックしてください

はじめに

この実験では、Python のクラスとインスタンスを探索し、オブジェクトがクラスのインスタンスであるかどうかを確認する方法を学びます。まず、クラス属性とインスタンス属性を持つ Dog クラスを作成し、次に Dog クラスのインスタンスを作成してそれらの属性にアクセスします。

次に、型チェックに isinstance() を使用する方法を学び、正確な一致を確認する type() と比較します。これにより、オブジェクトが特定のクラスまたはそのサブクラスに属しているかどうかを判断でき、Python のオブジェクト指向プログラミングについてより深い理解が得られます。


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL python(("Python")) -.-> python/FunctionsGroup(["Functions"]) python(("Python")) -.-> python/ObjectOrientedProgrammingGroup(["Object-Oriented Programming"]) python/FunctionsGroup -.-> python/build_in_functions("Build-in Functions") python/ObjectOrientedProgrammingGroup -.-> python/classes_objects("Classes and Objects") python/ObjectOrientedProgrammingGroup -.-> python/constructor("Constructor") python/ObjectOrientedProgrammingGroup -.-> python/inheritance("Inheritance") subgraph Lab Skills python/build_in_functions -.-> lab-559613{{"Python でオブジェクトがクラスのインスタンスであるかを確認する方法"}} python/classes_objects -.-> lab-559613{{"Python でオブジェクトがクラスのインスタンスであるかを確認する方法"}} python/constructor -.-> lab-559613{{"Python でオブジェクトがクラスのインスタンスであるかを確認する方法"}} python/inheritance -.-> lab-559613{{"Python でオブジェクトがクラスのインスタンスであるかを確認する方法"}} end

クラスとインスタンスの探索

このステップでは、Python のクラスとインスタンスについて学びます。クラスはオブジェクトを作成するための設計図のようなもので、インスタンスはその設計図から作成された実際のオブジェクトです。クラスとインスタンスを理解することは、Python のオブジェクト指向プログラミングの基礎です。

まず、Dog という簡単なクラスを作成しましょう。

  1. LabEx 環境で VS Code エディタを開きます。

  2. ~/project ディレクトリに dog.py という名前の新しいファイルを作成します。

    ~/project/dog.py
  3. dog.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 オブジェクトが作成されるときに、インスタンス属性 nameage を初期化するために使用されます。

  4. 次に、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 つのインスタンス buddymiles を作成しています。その後、ドット記法 (.) を使用して、それらのインスタンス属性 (nameage) およびクラス属性 (species) にアクセスしています。

  5. 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 ファイルを作成しましょう。

  1. LabEx 環境で VS Code エディタを開きます。

  2. ~/project ディレクトリに type_check.py という名前の新しいファイルを作成します。

    ~/project/type_check.py
  3. dog.py から Dog クラスの定義をコピーして、type_check.py に貼り付けます。この時点での type_check.py ファイルは次のようになります。

    class Dog:
        species = "Canis familiaris"
    
        def __init__(self, name, age):
            self.name = name
            self.age = age
  4. 次に、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 つのインスタンス buddymiles を作成しています。その後、isinstance() 関数を使用して、これらのインスタンスが Dog 型であるかどうかを確認しています。また、文字列 "Hello" が Dog クラスのインスタンスであるかどうかも確認しています。

  5. type_check.py スクリプトを実行するには、VS Code でターミナルを開き、以下のコマンドを実行します。

    python type_check.py

    以下の出力が表示されるはずです。

    True
    True
    False

    この出力は、buddymiles が確かに Dog クラスのインスタンスであり、文字列 "Hello" はそうではないことを示しています。

type() を使用した正確な型の比較

このステップでは、Python の type() 関数の使い方を学び、型チェックにおける isinstance() との違いを比較します。isinstance() はオブジェクトがあるクラスまたはそのサブクラスのインスタンスであるかをチェックしますが、type() はオブジェクトの正確な型を返します。

この違いを説明するために、Dog クラスのサブクラスを作成し、isinstance()type() の両方を使ってインスタンスの型をチェックしましょう。

  1. LabEx 環境で VS Code エディタを開きます。

  2. ~/project ディレクトリ内の type_check.py ファイルを編集します。

    ~/project/type_check.py
  3. Dog クラスを継承する 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

    ここで、GermanShepherdDog のサブクラスです。Dog クラスから nameage 属性を継承し、新しい属性 training_level を追加しています。

  4. 次に、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() を使ってそれらの型をチェックしています。

  5. 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 を返すのは、sparkyDog のサブクラスである GermanShepherd クラスのインスタンスであるからです。しかし、type(sparky) == DogFalse を返します。なぜなら type(sparky) は正確な型である GermanShepherd を返し、Dog ではないからです。

まとめ

この実験では、Python のクラスとインスタンスの基本を学びました。__init__ コンストラクタ内で初期化されるクラス属性とインスタンス属性を含むクラスの定義方法を学びました。

その後、Dog クラスのインスタンスを作成し、それぞれの属性に値を割り当てました。最後に、ドット表記を使用してインスタンス属性(名前、年齢)とクラス属性(種)の両方にアクセスし、オブジェクトとそのクラスに関連付けられた情報を取得する方法を実証しました。