У 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(аб’ект, клас) – гэта функцыя, якая вяртае праўду, калі аб’ект першага аргументу з’яўляецца асобнікам тыпу або падкласа другога аргумента.
Другі аргумент можа быць наборам тыпаў. Калі гэта асобнік любога тыпу, вяртаецца 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() вяртае праўду для асобнікаў падкласаў, якія наследуюць клас, паказаны ў якасці другога аргумента.
Напрыклад, вызначаны наступныя суперклас (базавы клас) і падклас (вытворны клас).
class Base:
pass
class Derive(Base):
pass
base = Base()
print(type(base))
# <class '__main__.Base'>
derive = Derive()
print(type(derive))
# <class '__main__.Derive'>
Вызначэнне тыпу з дапамогай type() вяртае праўду, толькі калі тыпы супадаюць, але isinstance() вяртае праўду нават для суперкласаў.
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 з’яўляецца падкласам цэлага тыпу, таму isinstance() вяртае праўду нават для 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