type()とisinstance()の違いは何ですか?

この2つのコードフラグメントの違いは何ですか? type()`を使用しています。

import types

if type(a) is types.DictType:
    do_something()
if type(b) in types.StringTypes:
    do_something_else()

isinstance()`を使用した場合。

if isinstance(a, dict):
    do_something()
if isinstance(b, str) or isinstance(b, unicode):
    do_something_else()

ここでは、typeでは実現できないことをisinstanceで実現している例を紹介します。

class Vehicle:
    pass

class Truck(Vehicle):
    pass

この場合、トラックオブジェクトはVehicleですが、次のようになります。

isinstance(Vehicle(), Vehicle)  # returns True
type(Vehicle()) == Vehicle      # returns True
isinstance(Truck(), Vehicle)    # returns True
type(Truck()) == Vehicle        # returns False, and this probably won't be what you want.

つまり、isinstanceはサブクラスにも当てはまるのです。

以下もご参照ください:

解説 (6)

後者の方がサブクラスを適切に扱うことができるので、好ましいです。実際,あなたの例はもっと簡単に書くことができます。なぜなら,isinstance()'の2番目のパラメータはタプルでもよいからです。

if isinstance(b, (str, unicode)):
    do_something_else()

または,抽象クラス basestring を使っています。

if isinstance(b, basestring):
    do_something_else()
解説 (0)

pythonのドキュメントによると、以下のような記述があります。

8.15. type - Names for built-in type

8.15.型 - 組み込み型の名前]() のようなファクトリー関数があります。 や str() などの組み込み関数は、対応する型の名前でもあります。 対応する型の名前でもあります。

そのため、type()`よりもisinstance()の方が好まれます。

解説 (0)