Sa Python, ang mga built-in na function type() at isinstance() ay ginagamit upang makuha at suriin ang uri ng isang bagay, tulad ng isang variable, at upang matukoy kung ito ay isang partikular na uri.
- class type(object) — Built-in Functions — Python 3.10.4 Documentation
- isinstance(object, classinfo) — Built-in Functions — Python 3.10.4 Documentation
Ang mga sumusunod na nilalaman ay ipinaliwanag dito, kasama ang sample code.
- Kunin at suriin ang uri ng bagay:
type()
- Pagpapasiya ng uri ng bagay:
type()
,isinstance()
- Pagpapasiya ng uri gamit ang uri()
- Uri ng pagpapasiya gamit ang isinstance()
- Pagkakaiba sa pagitan ng uri() at isinstance()
Sa halip na tukuyin ang uri ng isang bagay, maaaring gumamit ng exception handling o ang built-in na function na hasattr() upang matukoy kung ang isang bagay ay may mga tamang pamamaraan at katangian.
Kunin at suriin ang uri ng bagay:uri()
type(object) ay isang function na nagbabalik ng uri ng bagay na ipinasa bilang argumento. Ito ay magagamit upang malaman ang uri ng isang bagay.
print(type('string'))
# <class 'str'>
print(type(100))
# <class 'int'>
print(type([0, 1, 2]))
# <class 'list'>
Ang return value ng type() ay isang type object gaya ng str o int.
print(type(type('string')))
# <class 'type'>
print(type(str))
# <class 'type'>
Pagpapasiya ng uri ng bagay:type(),isinstance()
Gumamit ng type() o isinstance() upang matukoy ang uri.
Pagpapasiya ng uri gamit ang uri()
Sa pamamagitan ng paghahambing ng return value ng type() sa isang arbitrary type, maaari itong matukoy kung ang object ay nasa anumang uri.
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
Kung gusto mong matukoy kung isa ito sa ilang uri, gamitin ang in operator at isang tuple o listahan ng ilang uri.
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
Posible ring tukuyin ang mga function na nagbabago ng pagproseso depende sa uri ng argumento.
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
Uri ng pagpapasiya gamit ang isinstance()
Ang isinstance(object, class) ay isang function na nagbabalik ng true kung ang object ng unang argumento ay isang instance ng uri o subclass ng pangalawang argumento.
Ang pangalawang argumento ay maaaring isang tuple ng mga uri. Kung ito ay isang instance ng alinmang uri, ibabalik ang true.
print(isinstance('string', str))
# True
print(isinstance(100, str))
# False
print(isinstance(100, (int, str)))
# True
Ang isang function na katulad ng halimbawa ng uri ng pagpapasiya gamit ang type() ay maaaring isulat bilang mga sumusunod
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
Pagkakaiba sa pagitan ng uri() at isinstance()
Ang pagkakaiba sa pagitan ng type() at isinstance() ay ang isinstance() ay nagbabalik ng true para sa mga pagkakataon ng mga subclass na nagmamana ng klase na tinukoy bilang pangalawang argumento.
Halimbawa, ang sumusunod na superclass (base class) at subclass (derived class) ay tinukoy
class Base:
pass
class Derive(Base):
pass
base = Base()
print(type(base))
# <class '__main__.Base'>
derive = Derive()
print(type(derive))
# <class '__main__.Derive'>
Ang pagpapasiya ng uri gamit ang type() ay nagbabalik lamang ng true kapag ang mga uri ay tumutugma, ngunit ang isinstance() ay nagbabalik ng true kahit para sa mga superclass.
print(type(derive) is Derive)
# True
print(type(derive) is Base)
# False
print(isinstance(derive, Derive))
# True
print(isinstance(derive, Base))
# True
Kahit na para sa mga karaniwang uri, halimbawa, ang boolean type na bool (true,false), dapat mag-ingat. Ang bool ay isang subclass ng uri ng integer, kaya ang isinstance() ay nagbabalik ng true kahit para sa isang int kung saan ito minana.
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
Kung nais mong matukoy ang eksaktong uri, gamitin ang uri(); kung gusto mong matukoy ang uri na may inheritance na isinasaalang-alang, gamitin ang isinstance().
Ang built-in na function na issubclass() ay ibinigay din upang matukoy kung ang isang klase ay isang subclass ng isa pang klase.
print(issubclass(bool, int))
# True
print(issubclass(bool, float))
# False