Was sind die Unterschiede zwischen type() und isinstance()?

Was sind die Unterschiede zwischen diesen beiden Codefragmenten? Verwendung von type():

import types

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

Verwendung von isinstance():

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

Hier ist ein Beispiel, bei dem isinstance etwas erreicht, was type nicht kann:

class Vehicle:
    pass

class Truck(Vehicle):
    pass

in diesem Fall ist ein LKW-Objekt ein Fahrzeug, aber man erhält dies:

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.

Mit anderen Worten, isinstance ist auch für Unterklassen wahr.

Siehe auch:

Kommentare (6)

Letzteres ist vorzuziehen, weil es Unterklassen richtig behandelt. Tatsächlich kann Ihr Beispiel sogar noch einfacher geschrieben werden, weil der zweite Parameter von "isinstance()" ein Tupel sein kann:

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

oder, unter Verwendung der abstrakten Klasse basestring:

if isinstance(b, basestring):
    do_something_else()
Kommentare (0)

Gemäß der Python-Dokumentation ist hier eine Anweisung:

8.15. types - Namen für eingebaute Typen

Beginnend mit Python 2.2, werden eingebaute Fabrikfunktionen wie int() und str() sind auch Namen für die entsprechenden Typen.

Daher sollte isinstance() gegenüber type() bevorzugt werden.

Kommentare (0)