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ī: https://stackoverflow.com/q/707674/1341006
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()
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()
unstr()
ir arī nosaukumi atbilstošo tipu nosaukumi.
Tāpēc priekšroka jādod `isinstance()
, nevis type()
.