В Python вградените функции type() и isinstance() се използват за получаване и проверка на типа на обект, например променлива, и за определяне дали той е от определен тип.
- class type(object) — Built-in Functions — Python 3.10.4 Documentation
- isinstance(object, classinfo) — Built-in Functions — Python 3.10.4 Documentation
Тук е обяснено следното съдържание, както и примерен код.
- Получаване и проверка на типа на обекта:
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