home changes contents help options

243:オブジェクトのクラスを調べる

オブジェクトの所属クラスを得る

オブジェクトの所属するクラスオブジェクトは type 関数で得ることができます。また、その名前はクラスオブジェクトの __name__ 属性にあります。

>>> s = 'abc'
>>> type(s)
<type 'str'>
>>> type(s).__name__
'str'

あるオブジェクトが、特定のクラスのインスタンスか調べる

組み込み関数 isinstance を用います。オブジェクトがサブクラスのインスタンスの場合でも True となります。

>>> s = 'abc'
>>> isinstance(s, str)
True
>>> isinstance(s, basestring)
True
>>> isinstance(s, int)
False

あるクラスそのもののインスタンスであることを確認するには次のようにします。とはいえ、ここまで固い型チェックは Python らしくないのも事実です。

>>> s = 'abc'
>>> type(s) == str
True
>>> type(s) == basestring
False

オブジェクトが関連するクラス・モジュールのリストを得る

inspect モジュールを用います。このモジュールにはオブジェクトからさまざまな情報を取り出すための便利な関数がまとまっています。

>>> import inspect
>>> s = 'abc'
>>> inspect.getclasstree([s.__class__])
[(<type 'basestring'>, (<type 'object'>,)), [(<type 'str'>, (<type 'basestring'>
,))]]
>>> inspect.getmodule(s.__class__)
<module '__builtin__' (built-in)>
>>> inspect.getsourcefile(s.__class__)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "C:\Python25\Lib\inspect.py", line 383, in getsourcefile
    filename = getfile(object)
  File "C:\Python25\Lib\inspect.py", line 352, in getfile
    raise TypeError('arg is a built-in class')
TypeError: arg is a built-in class
>>>
>>> import StringIO
>>> inspect.getmodule(StringIO.StringIO)
<module 'StringIO' from 'C:\python25\lib\StringIO.pyc'>
>>> inspect.getsourcefile(StringIO.StringIO)
'C:\\python25\\lib\\StringIO.py'