Kādas ir atšķirības starp type() un isinstance()?

Kādas ir atšķirības starp šiem diviem koda fragmentiem? Izmantojot type():

import types

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

Izmantojot isinstance():

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

Lūk, piemērs, kur isinstance sasniedz to, ko type nespēj:

class Vehicle:
    pass

class Truck(Vehicle):
    pass

šajā gadījumā kravas automašīnas objekts ir Vehicle, bet jūs'iegūsiet šo:

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.

Citiem vārdiem sakot, isinstance ir patiess arī apakšklasēm.

Skatiet arī:

Komentāri (6)

Pēdējais variants ir vēlams, jo tas pareizi apstrādā apakšklases. Patiesībā jūsu piemēru var uzrakstīt vēl vienkāršāk, jo isinstance()'otrais parametrs var būt tuple:

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

vai, izmantojot basestring abstrakto klasi:

if isinstance(b, basestring):
    do_something_else()
Komentāri (0)

Saskaņā ar python dokumentāciju šeit ir paziņojums:

tipi - iebūvēto tipu nosaukumi](http://docs.python.org/library/types.html).

Sākot ar Python 2.2, iebūvētie tipi rūpnīcas funkcijas, piemēram, int() un str() ir arī nosaukumi atbilstošo tipu nosaukumi.

Tāpēc priekšroka jādod `isinstance(), nevis type().

Komentāri (0)