Quelles sont les différences entre type() et isinstance() ?

Quelles sont les différences entre ces deux fragments de code ? Utilisation de type() :

import types

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

En utilisant isinstance() :

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

Voici un exemple où isinstance réalise quelque chose que type ne peut pas faire :

class Vehicle:
    pass

class Truck(Vehicle):
    pass

dans ce cas, l'objet camion est un Véhicule, mais vous obtiendrez ceci :

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.

En d'autres termes, isinstance est vrai pour les sous-classes, aussi.

Voir aussi :

Commentaires (6)

Cette dernière solution est préférable, car elle permet de gérer correctement les sous-classes. En fait, votre exemple peut être écrit encore plus facilement car le second paramètre de isinstance() peut être un tuple :

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

ou, en utilisant la classe abstraite basestring :

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

Selon la documentation python, voici une déclaration :

8.15. types - Noms des types intégrés

À partir de Python 2.2, les fonctions intégrées intégrées telles que int() et str(). str() sont aussi des noms pour les > types correspondants. types correspondants.

Ainsi, isinstance() doit être préféré à type().

Commentaires (0)