Какви са разликите между тези два фрагмента код?
Използване на type()
:
import types
if type(a) is types.DictType:
do_something()
if type(b) in types.StringTypes:
do_something_else()
Използване на isinstance()
:
if isinstance(a, dict):
do_something()
if isinstance(b, str) or isinstance(b, unicode):
do_something_else()
Ето един пример, в който isinstance
постига нещо, което type
не може:
class Vehicle:
pass
class Truck(Vehicle):
pass
в този случай обектът камион е Vehicle (превозно средство), но ще получите това:
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.
С други думи, isinstance
е вярно и за подкласовете.
Вижте също: https://stackoverflow.com/q/707674/1341006
Последният вариант е за предпочитане, тъй като при него подкласовете се обработват правилно. Всъщност вашият пример може да бъде написан още по-лесно, защото вторият параметър на isinstance()
'може да бъде кортеж:
if isinstance(b, (str, unicode)):
do_something_else()
или, използвайки абстрактния клас basestring
:
if isinstance(b, basestring):
do_something_else()
Според документацията на питон тук има изявление:
типове - Имена за вградени типове](http://docs.python.org/library/types.html)
От версия 2.2 на Python вградените фабрични функции като
int()
иstr()
също са имена за съответните типове.
Така че isinstance()
трябва да се предпочита пред type()
.