Pythonの型オブジェクト徹底解説!type()関数の使い方とクラスの動的生成
Pythonにおける型オブジェクトとは
Pythonでは、クラスも含めてすべてがオブジェクトです。そして、すべてのクラスは「type」というクラスのインスタンスになっています。興味深いことに、typeオブジェクト自身もまたtypeクラスのインスタンスです。
クラスオブジェクトの__bases__属性を調べることで、そのクラスの継承階層を確認できます。また、type()メソッドは、引数として渡されたオブジェクトのクラス型を返します。
- 引数が1つの場合:
type(obj)— 指定したオブジェクトの型を返します。 - 引数が3つの場合:
type(name, bases, dict)— 新しい型オブジェクト(クラス)を動的に作成して返します。
type()の基本的な使い方
まずは、よく使われるデータ型がどのクラスに属しているのかを見てみましょう。以下のプログラムでは、いくつかの変数を初期化し、type()を使ってそれぞれのクラスを確認しています。
コード例
# いくつかの変数を定義
a = 5
b = 5.2
c = 'hello'
A = [1,4,7]
B = {'k1':'Sun','K2':"Mon",'K3':'Tue'}
C = ('Sky','Blue','Vast')
print(type(a))
print(type(b))
print(type(c))
print(type(A))
print(type(B))
print(type(C))
出力結果
上記のコードを実行すると、次のような結果が得られます。
<class 'int'> <class 'float'> <class 'str'> <class 'list'> <class 'dict'> <class 'tuple'>
クラス自体の型を調べる
さらに一歩進んで、上記で登場したクラスそのものの型を調べてみると、それらがすべて「type」という名前のクラスに属していることがわかります。
コード例
print(type(int)) print(type(dict)) print(type(list)) print(type(type))
出力結果
上記のコードを実行すると、次のような結果が得られます。
<class 'type'> <class 'type'> <class 'type'> <class 'type'>
新しいオブジェクト型(クラス)を動的に作成する
type()に3つの引数を渡すことで、新しいクラスを動的に生成することもできます。第1引数にはクラス名、第2引数には基底クラスのタプル、第3引数には属性を格納した辞書を指定します。
コード例
Object1 = type('A', (object,), dict(a='Hello', b=5))
print(type(Object1))
print(vars(Object1))
class NewClass:
a = 'Good day!'
b = 7
Object2 = type('B', (NewClass,), dict(a='Hello', b=5))
print(type(Object2))
print(vars(Object2))
出力結果
上記のコードを実行すると、次のような結果が得られます。
<class 'type'>
{'a': 'Hello', 'b': 5, '__module__': '__main__', '__dict__': <attribute '__dict__' of 'A' objects>, '__weakref__': <attribute '__weakref__' of 'A' objects>, '__doc__': None}
<class 'type'>
{'a': 'Hello', 'b': 5, '__module__': '__main__', '__doc__': None}
このように、通常はclass文を使って定義するクラスも、type()を使えば実行時に動的に作成できます。既存クラスを基底クラスとして指定すれば、継承関係を持ったクラスの生成も可能です。これはPythonのメタプログラミングの基礎となる重要な仕組みなので、ぜひ理解しておきましょう。
-
【Python入門】メタクラスによるメタプログラミングの基本と実践例
メタプログラミングとは、プログラムが自分自身を操作したり、自身についての知識を持ったりするプログラミング手法のことを指します。Pythonでは「メタクラス」と呼ばれる特殊なクラスを使うことで、クラスに対するメタプログラミングを実現できます。メタクラスによるメタプログラミングでは、既存のコードを修正・ラップ・生成することでコードを操作する関数やクラスを構築します。メタプログラミングの主な機能は以下の通りです。メタクラスデコレータクラスデコレータメタクラスとは何かメタクラスを簡潔に定義するなら、「クラスを作り出すクラス」です。Pythonはオブジェクト指向言語であり、すべてがオブジェクトとして扱わ
-
Pythonのクラスはどのようにobjectを継承するのか?
Pythonでは、クラスが組み込み型を基底クラス(ベースクラス)として持つかどうかによって、クラスのスタイルが異なります。ここでは、Python 2.xとPython 3.xにおけるobject継承の違いを解説します。 Python 2.x:2種類のクラススタイル Python 2.xには、組み込み型を基底クラスとして持つかどうかに応じて、2つのスタイルのクラスが存在します。 旧スタイル(クラシック)クラス 旧スタイル、いわゆる「クラシック」クラスは、組み込み型を基底クラスとして持ちません。基底クラスを指定せずにクラスを定義すると、このスタイルになります。 >>>