type(), isinstance() за получаване и определяне на типа в Python

Бизнес

В Python вградените функции type() и isinstance() се използват за получаване и проверка на типа на обект, например променлива, и за определяне дали той е от определен тип.

Тук е обяснено следното съдържание, както и примерен код.

  • Получаване и проверка на типа на обекта:type()
  • Определяне на типа на обекта:type(),isinstance()
    • Определяне на типа чрез type()
    • Определяне на типа с помощта на isinstance()
    • Разлика между type() и isinstance()

Вместо да се определя типът на обекта, може да се използва обработката на изключения или вградената функция hasattr(), за да се определи дали обектът има правилните методи и атрибути.

Получаване и проверка на типа на обекта: тип()

type(object) е функция, която връща типа на обекта, подаден като аргумент. Тя може да се използва за установяване на типа на даден обект.

print(type('string'))
# <class 'str'>

print(type(100))
# <class 'int'>

print(type([0, 1, 2]))
# <class 'list'>

Върнатата стойност на type() е обект от тип, например str или int.

print(type(type('string')))
# <class 'type'>

print(type(str))
# <class 'type'>

Определяне на типа на обекта: type(), isinstance()

Използвайте type() или isinstance(), за да определите типа.

Определяне на типа чрез type()

Чрез сравняване на върнатата стойност на type() с произволен тип може да се определи дали обектът е от някакъв тип.

print(type('string') is str)
# True

print(type('string') is int)
# False
def is_str(v):
    return type(v) is str

print(is_str('string'))
# True

print(is_str(100))
# False

print(is_str([0, 1, 2]))
# False

Ако искате да определите дали е един от няколко типа, използвайте оператора in и кортеж или списък от няколко типа.

def is_str_or_int(v):
    return type(v) in (str, int)

print(is_str_or_int('string'))
# True

print(is_str_or_int(100))
# True

print(is_str_or_int([0, 1, 2]))
# False

Възможно е също така да се дефинират функции, които променят обработката в зависимост от типа на аргумента.

def type_condition(v):
    if type(v) is str:
        print('type is str')
    elif type(v) is int:
        print('type is int')
    else:
        print('type is not str or int')

type_condition('string')
# type is str

type_condition(100)
# type is int

type_condition([0, 1, 2])
# type is not str or int

Определяне на типа с помощта на isinstance()

isinstance(object, class) е функция, която връща true, ако обектът от първия аргумент е инстанция на типа или подкласа на втория аргумент.

Вторият аргумент може да бъде кортеж от типове. Ако той е екземпляр на някой от типовете, се връща true.

print(isinstance('string', str))
# True

print(isinstance(100, str))
# False

print(isinstance(100, (int, str)))
# True

Функция, подобна на примера за определяне на типа чрез type(), може да бъде записана по следния начин

def is_str(v):
    return isinstance(v, str)

print(is_str('string'))
# True

print(is_str(100))
# False

print(is_str([0, 1, 2]))
# False
def is_str_or_int(v):
    return isinstance(v, (int, str))

print(is_str_or_int('string'))
# True

print(is_str_or_int(100))
# True

print(is_str_or_int([0, 1, 2]))
# False
def type_condition(v):
    if isinstance(v, str):
        print('type is str')
    elif isinstance(v, int):
        print('type is int')
    else:
        print('type is not str or int')

type_condition('string')
# type is str

type_condition(100)
# type is int

type_condition([0, 1, 2])
# type is not str or int

Разлика между type() и isinstance()

Разликата между type() и isinstance() е, че isinstance() връща true за екземплярите на подкласовете, които наследяват класа, посочен като втори аргумент.

Например са дефинирани следните суперклас (базов клас) и подклас (производен клас)

class Base:
    pass

class Derive(Base):
    pass

base = Base()
print(type(base))
# <class '__main__.Base'>

derive = Derive()
print(type(derive))
# <class '__main__.Derive'>

Определянето на типа чрез type() връща true само когато типовете съвпадат, но isinstance() връща true дори за суперкласовете.

print(type(derive) is Derive)
# True

print(type(derive) is Base)
# False

print(isinstance(derive, Derive))
# True

print(isinstance(derive, Base))
# True

Дори за стандартните типове, например булевия тип bool (true,false), трябва да се внимава. bool е подклас на типа integer, така че isinstance() връща true дори за int, от който е наследен.

print(type(True))
# <class 'bool'>

print(type(True) is bool)
# True

print(type(True) is int)
# False

print(isinstance(True, bool))
# True

print(isinstance(True, int))
# True

Ако искате да определите точния тип, използвайте type(); ако искате да определите типа с отчитане на наследяването, използвайте isinstance().

Предоставена е и вградената функция issubclass(), която определя дали даден клас е подклас на друг клас.

print(issubclass(bool, int))
# True

print(issubclass(bool, float))
# False