Pythonissa sisäänrakennettuja funktioita type() ja isinstance() käytetään objektin, esimerkiksi muuttujan, tyypin hakemiseen ja tarkistamiseen sekä sen määrittämiseen, onko se tietyn tyyppinen.
- class type(object) — Built-in Functions — Python 3.10.4 Documentation
- isinstance(object, classinfo) — Built-in Functions — Python 3.10.4 Documentation
Seuraavat sisällöt selitetään tässä yhdessä esimerkkikoodin kanssa.
- Hanki ja tarkista objektin tyyppi:
type()
- Kohteen tyypin määrittäminen:
type()
,isinstance()
- Tyypin määrittäminen type() -toiminnolla
- Tyypin määrittäminen isinstance() -toiminnon avulla
- Type():n ja isinstance():n välinen ero
Objektin tyypin määrittämisen sijaan voidaan käyttää poikkeusten käsittelyä tai sisäänrakennettua funktiota hasattr() sen määrittämiseen, onko objektilla oikeat metodit ja attribuutit.
Hanki ja tarkista objektin tyyppi: type()
type(object) on funktio, joka palauttaa argumenttina annetun objektin tyypin. Tätä voidaan käyttää objektin tyypin selvittämiseen.
print(type('string'))
# <class 'str'>
print(type(100))
# <class 'int'>
print(type([0, 1, 2]))
# <class 'list'>
type():n paluuarvo on tyyppiobjekti, kuten str tai int.
print(type(type('string')))
# <class 'type'>
print(type(str))
# <class 'type'>
Kohteen tyypin määrittäminen: type(), isinstance()
Käytä type() tai isinstance() -toimintoa tyypin määrittämiseen.
Tyypin määrittäminen type() -toiminnolla
Vertaamalla type():n paluuarvoa mielivaltaiseen tyyppiin voidaan määrittää, onko objekti minkä tahansa tyyppinen.
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
Jos haluat määrittää, onko se yksi useammasta tyypistä, käytä in-operaattoria ja useamman tyypin tupelia tai listaa.
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
On myös mahdollista määritellä funktioita, joiden käsittely muuttuu argumentin tyypin mukaan.
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
Tyypin määrittäminen isinstance() -toiminnon avulla
isinstance(object, class) on funktio, joka palauttaa arvon true, jos ensimmäisen argumentin objekti on toisen argumentin tyypin tai aliluokan instanssi.
Toinen argumentti voi olla tyyppien sarja. Jos se on jommankumman tyypin instanssi, palautetaan true.
print(isinstance('string', str))
# True
print(isinstance(100, str))
# False
print(isinstance(100, (int, str)))
# True
Samanlainen funktio kuin esimerkki tyypin määrittämisestä type():n avulla voidaan kirjoittaa seuraavasti
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():n ja isinstance():n välinen ero
Type() ja isinstance() eroavat toisistaan siten, että isinstance() palauttaa totuuden sellaisten aliluokkien instansseista, jotka perivät toisena argumenttina määritetyn luokan.
Esimerkiksi seuraavat superclass (perusluokka) ja subclass (johdettu luokka) on määritelty seuraavasti
class Base:
pass
class Derive(Base):
pass
base = Base()
print(type(base))
# <class '__main__.Base'>
derive = Derive()
print(type(derive))
# <class '__main__.Derive'>
Tyyppien määrittäminen type()-toiminnolla palauttaa true-tuloksen vain silloin, kun tyypit täsmäävät, mutta isinstance()-toiminto palauttaa true-tuloksen myös superluokille.
print(type(derive) is Derive)
# True
print(type(derive) is Base)
# False
print(isinstance(derive, Derive))
# True
print(isinstance(derive, Base))
# True
Jopa standardityyppien, esimerkiksi boolean-tyypin bool (true,false), kohdalla on noudatettava varovaisuutta. bool on kokonaislukutyypin alaluokka, joten isinstance() palauttaa true-tuloksen myös int-tyypille, josta se on peritty.
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
Jos haluat määrittää tarkan tyypin, käytä type(); jos haluat määrittää tyypin periytyminen huomioon ottaen, käytä isinstance().
Sisäänrakennetulla funktiolla issubclass() voidaan myös määrittää, onko luokka toisen luokan aliluokka.
print(issubclass(bool, int))
# True
print(issubclass(bool, float))
# False