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


Answers

Voici pourquoi isinstance vaut mieux que type :

class Vehicle:
    pass

class Truck(Vehicle):
    pass

dans ce cas, un objet de 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 également vrai pour les sous-classes.

Voir aussi: Comment comparer le type d'un objet en Python?

Question

Quelles sont les différences entre ces deux fragments de code? En utilisant 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()



Ce dernier est préféré, car il traitera correctement les sous-classes. En fait, votre exemple peut être écrit encore plus facilement parce isinstance() le deuxième 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()