型の確認

Python SELF JA
レベル 16 , レッスン 3
使用可能

9.1 type()関数

Pythonには、オブジェクトの型やクラスを確認するためのいくつかの組み込み関数があります。これらの関数は、さまざまなデータ型で動作する柔軟で安全なコードを書くのに便利です。

ここでは、その中でも特に人気のものについて紹介します。type()isinstance()issubclass()、そして型アノテーション用のgetattr()hasattr()のような関数についても。

type()関数

type()関数はオブジェクトの型を返します。もうすでに使ったことがあるよね?


x = 10
print(type(x))  # Output: <class 'int'>

でも、これを使って新しいクラスを作成できるって知ってた?

新しいクラスの作成

3つの引数を渡すと、新しいタイプ(クラス)を作成します。

そのシグネチャはこうです:


type(name, bases, dict)

ここで:

  • name — 作成するクラスの名前(文字列)。
  • bases — 新しいクラスが継承する基底クラス(親)のタプル。
  • dict — 新しいクラスの属性とメソッドを含む辞書。

簡単なクラスの作成:


MyClass = type('MyClass', (), {'say_hello': lambda self: print("Hello!")})

# クラスのインスタンスを作成
instance = MyClass()
instance.say_hello()  # Output: Hello!

もっと複雑なものも作成できるよ:


MyClass = type('MyClass', (), {
    'attribute': 42,
    '__init__': lambda self, value: setattr(self, 'value', value),
    'display_value': lambda self: print(self.value)
})
            
# クラスのインスタンスを作成
instance = MyClass(10)
print(instance.attribute)  # Output: 42
instance.display_value()  # Output: 10

だから、オブジェクトの型を決めるだけでなく、クラスを作成して、そのオブジェクトを作り、後でその型を確認することができるんだ。

9.2 isinstance()関数

isinstance()関数は、Pythonの組み込み関数で、オブジェクトが特定のクラスまたはクラスのタプルに属しているかどうかを確認するためのものです。この関数は、オブジェクトが指定されたクラスのインスタンスであるか、タプル内の任意のクラスのインスタンスである場合、Trueを返し、そうでない場合はFalseを返します。

シグネチャとパラメータ:


isinstance(object, classinfo)

ここで:

  • object — クラスやクラスに属しているかどうかを確認したいオブジェクト。
  • classinfo — オブジェクトが確認されるクラス、型、またはクラスと型のタプル。

使用例:

1つのクラスに属しているかの確認


x = 10
print(isinstance(x, int))  # Output: True
            
y = "Hello"
print(isinstance(y, str))  # Output: True

複数のクラスに属しているかの確認 — 少なくとも1つ:


x = 10
print(isinstance(x, (int, float)))  # Output: True
            
y = "Hello"
print(isinstance(y, (int, str)))  # Output: True
            
z = 3.14
print(isinstance(z, (int, str)))  # Output: False

カスタムクラスに属しているかの確認


class Animal:
    pass
        
class Dog(Animal):
    pass
        
dog = Dog()
        
print(isinstance(dog, Dog))  # Output: True
print(isinstance(dog, Animal))  # Output: True

type()を使った直接的な型比較とは異なり、isinstance()は継承を正しく処理し、オブジェクトが階層内の任意のクラスに属しているかを確認します。

9.3 issubclass()関数

issubclass()関数は、Pythonの組み込み関数で、指定されたクラスが他のクラスまたはクラスのタプルのサブクラスであるかどうかを確認するためのものです。この関数は、最初の引数が実際に2番目のサブクラスである場合、Trueを返し、そうでない場合はFalseを返します。

シグネチャとパラメータ:


issubclass(class, classinfo)

ここで:

  • class — 属しているかどうかを確認したいクラス。
  • classinfo — 最初の引数が確認されるクラス、型、またはクラスと型のタプル。

使用例:

1つのクラスに属しているかの確認



class Animal:
    pass
         
class Dog(Animal):
    pass
        
print(issubclass(Dog, Animal))  # Output: True
print(issubclass(Animal, Dog))  # Output: False 

複数のクラスに属しているかの確認 — 少なくとも1つ:


class Animal:
    pass
        
class Dog(Animal):
    pass
        
class Cat(Animal):
    pass
        
print(issubclass(Dog, (Animal, Cat)))  # Output: True
print(issubclass(Dog, (Cat,)))  # Output: False

カスタムクラスを使った例

組み込みクラスからの継承


class MyInt(int):
    pass
        
print(issubclass(MyInt, int))  # Output: True
print(issubclass(int, MyInt))  # Output: False

継承の階層


class A:
    pass
        
class B(A):
    pass
        
class C(B):
    pass
        
print(issubclass(C, A))  # Output: True
print(issubclass(C, B))  # Output: True
print(issubclass(B, A))  # Output: True
print(issubclass(A, C))  # Output: False

issubclass()の利点

クラス階層の確認: issubclass()はクラスの階層を確認することができ、継承とコードの構造の正しさを保証するのに役立ちます。

柔軟性: 関数は1つのクラスやクラスのタプルの確認をサポートしており、さまざまなシナリオでの柔軟な使用が可能です。

メタプログラミングの利便性: issubclass()は、メタプログラミングや動的な型やクラスを扱うコードを書く際によく使用されます。この点に関しては、もっと先になったら話しますね :)

コメント
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION