[python] Каковы различия между типами () и isinstance ()?



1 Answers

Вот почему isinstance лучше, чем type :

class Vehicle:
    pass

class Truck(Vehicle):
    pass

в этом случае объект грузовика является транспортным средством, но вы получите следующее:

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 верно и для подклассов.

Также см .: Как сравнить тип объекта в Python?

Question

Каковы различия между этими двумя фрагментами кода? Использование 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() может быть кортежем:

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

или, используя basestring абстрактный класс:

if isinstance(b, basestring):
    do_something_else()



Related