Quali sono le differenze tra type() e isinstance()?

Quali sono le differenze tra questi due frammenti di codice? Usando type():

import types

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

Usando isinstance():

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

Ecco un esempio in cui isinstance ottiene qualcosa che type non può:

class Vehicle:
    pass

class Truck(Vehicle):
    pass

in questo caso, un oggetto camion è un Veicolo, ma si ottiene questo:

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.

In altre parole, isinstance è vero anche per le sottoclassi.

Vedi anche:

Commentari (6)

Quest'ultimo è preferito, perché gestirà correttamente le sottoclassi. In effetti, il tuo esempio può essere scritto ancora più facilmente perché il secondo parametro di isinstance()'può essere una tupla:

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

oppure, usando la classe astratta basestring:

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

Secondo la documentazione di python ecco una dichiarazione:

8.15. tipi - Nomi per i tipi built-in

A partire da Python 2.2, i built-in come int() e str() sono anche nomi per i tipi corrispondenti.

Quindi isinstance() dovrebbe essere preferito a type().

Commentari (0)