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()
は、メタプログラミングや動的な型やクラスを扱うコードを書く際によく使用されます。この点に関しては、もっと先になったら話しますね :)
GO TO FULL VERSION