Pythonis kasutatakse sisseehitatud funktsioone type() ja isinstance(), et saada ja kontrollida objekti, näiteks muutuja, tüüpi ning teha kindlaks, kas see on teatud tüüpi.
- class type(object) — Built-in Functions — Python 3.10.4 Documentation
- isinstance(object, classinfo) — Built-in Functions — Python 3.10.4 Documentation
Siin selgitatakse järgmist sisu koos näidiskoodiga.
- Objekti tüübi hankimine ja kontrollimine:
type()
- Objekti tüübi määramine:
type()
,isinstance()
- Tüübi määramine type() abil
- Tüübi määramine isinstance() abil
- Erinevus type() ja isinstance() vahel
Objekti tüübi määramise asemel võib kasutada erandite käsitlemist või sisseehitatud funktsiooni hasattr(), et teha kindlaks, kas objektil on õiged meetodid ja atribuudid.
Objekti tüübi hankimine ja kontrollimine: type()
type(object) on funktsioon, mis tagastab argumendiks antud objekti tüübi. Seda saab kasutada objekti tüübi väljaselgitamiseks.
print(type('string'))
# <class 'str'>
print(type(100))
# <class 'int'>
print(type([0, 1, 2]))
# <class 'list'>
Type() tagastusväärtus on tüübiobjekt, näiteks str või int.
print(type(type('string')))
# <class 'type'>
print(type(str))
# <class 'type'>
Objekti tüübi määramine: type(), isinstance()
Tüübi määramiseks kasutage type() või isinstance().
Tüübi määramine type() abil
Võrreldes type() tagastusväärtust suvalise tüübiga, saab kindlaks teha, kas objekt on mis tahes tüüpi.
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
Kui soovite kindlaks teha, kas tegemist on ühega mitmest tüübist, kasutage in-operaatorit ja mitmest tüübist koosnevat tuplit või loendit.
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
Samuti on võimalik defineerida funktsioone, mis muudavad töötlemist sõltuvalt argumendi tüübist.
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
Tüübi määramine isinstance() abil
isinstance(object, class) on funktsioon, mis tagastab tõese tulemuse, kui esimese argumendi objekt on teise argumendi tüübi või alamklassi eksemplar.
Teiseks argumendiks võib olla tüüpide tupel. Kui see on kummagi tüübi eksemplar, tagastatakse true.
print(isinstance('string', str))
# True
print(isinstance(100, str))
# False
print(isinstance(100, (int, str)))
# True
Tüübi määramise näitega sarnase funktsiooni type() abil saab kirjutada järgmiselt
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
Erinevus type() ja isinstance() vahel
Erinevus type() ja isinstance() vahel seisneb selles, et isinstance() tagastab tõese väärtuse nende alamklasside instantside puhul, mis pärivad teise argumendina määratud klassi.
Näiteks on määratletud järgmine superklass (baasklass) ja alamklass (tuletatud klass)
class Base:
pass
class Derive(Base):
pass
base = Base()
print(type(base))
# <class '__main__.Base'>
derive = Derive()
print(type(derive))
# <class '__main__.Derive'>
Tüübi määramine type() abil tagastab true ainult siis, kui tüübid ühtivad, kuid isinstance() tagastab true ka superklasside puhul.
print(type(derive) is Derive)
# True
print(type(derive) is Base)
# False
print(isinstance(derive, Derive))
# True
print(isinstance(derive, Base))
# True
Isegi standardtüüpide, näiteks boole'i tüübi bool (true,false) puhul tuleb olla ettevaatlik. bool on integer-tüübi alamklass, nii et isinstance() tagastab true isegi int-tüübi puhul, millest see on päritud.
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
Kui soovite määrata täpse tüübi, kasutage type(); kui soovite määrata tüübi koos pärimise arvestamisega, kasutage isinstance().
Sisseehitatud funktsioon issubclass() on ette nähtud ka selleks, et määrata, kas klass on teise klassi alamklass.
print(issubclass(bool, int))
# True
print(issubclass(bool, float))
# False