U Pythonu se ugrađene funkcije type() i isinstance() koriste za dobivanje i provjeru tipa objekta, kao što je varijabla, i za utvrđivanje je li on određenog tipa.
- class type(object) — Built-in Functions — Python 3.10.4 Documentation
- isinstance(object, classinfo) — Built-in Functions — Python 3.10.4 Documentation
Ovdje je objašnjen sljedeći sadržaj, zajedno s uzorkom koda.
- Nabavite i provjerite vrstu objekta:
type()
- Određivanje vrste objekta:
type()
,isinstance()
- Određivanje tipa pomoću type()
- Određivanje tipa pomoću isinstance()
- Razlika između type() i isinstance()
Umjesto određivanja tipa objekta, može se koristiti rukovanje iznimkama ili ugrađena funkcija hasattr() kako bi se utvrdilo ima li objekt ispravne metode i atribute.
Nabavite i provjerite vrstu objekta:tip()
type(object) je funkcija koja vraća tip objekta koji je proslijeđen kao argument. Ovo se može koristiti za doznavanje vrste objekta.
print(type('string'))
# <class 'str'>
print(type(100))
# <class 'int'>
print(type([0, 1, 2]))
# <class 'list'>
Povratna vrijednost type() je objekt tipa kao što je str ili int.
print(type(type('string')))
# <class 'type'>
print(type(str))
# <class 'type'>
Određivanje vrste objekta:type(),isinstance()
Koristite type() ili isinstance() da odredite vrstu.
Određivanje tipa pomoću type()
Usporedbom povratne vrijednosti type() s proizvoljnim tipom, može se utvrditi je li objekt bilo koje vrste.
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
Ako želite utvrditi radi li se o jednoj od nekoliko vrsta, upotrijebite operator in i torku ili popis nekoliko tipova.
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
Također je moguće definirati funkcije koje mijenjaju obradu ovisno o vrsti argumenta.
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
Određivanje tipa pomoću isinstance()
isinstance(objekt, klasa) je funkcija koja vraća true ako je objekt prvog argumenta instanca tipa ili podklase drugog argumenta.
Drugi argument može biti niz tipova. Ako se radi o instanci bilo kojeg tipa, vraća se true.
print(isinstance('string', str))
# True
print(isinstance(100, str))
# False
print(isinstance(100, (int, str)))
# True
Funkcija slična primjeru određivanja tipa pomoću type() može se napisati na sljedeći način
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
Razlika između type() i isinstance()
Razlika između type() i isinstance() je u tome što isinstance() vraća true za instance potklasa koje nasljeđuju klasu navedenu kao drugi argument.
Na primjer, definirane su sljedeća superklasa (osnovna klasa) i podklasa (izvedena klasa).
class Base:
pass
class Derive(Base):
pass
base = Base()
print(type(base))
# <class '__main__.Base'>
derive = Derive()
print(type(derive))
# <class '__main__.Derive'>
Određivanje tipa pomoću type() vraća true samo kada se tipovi podudaraju, ali isinstance() vraća true čak i za superklase.
print(type(derive) is Derive)
# True
print(type(derive) is Base)
# False
print(isinstance(derive, Derive))
# True
print(isinstance(derive, Base))
# True
Čak i za standardne tipove, na primjer, booleov tip bool (true,false), mora se paziti. bool je podklasa cjelobrojnog tipa, tako da isinstance() vraća true čak i za int od kojeg je naslijeđen.
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
Ako želite odrediti točan tip, koristite type(); ako želite odrediti tip s uzetom u obzir nasljeđivanje, koristite isinstance().
Ugrađena funkcija issubclass() također je osigurana za određivanje je li klasa podklasa druge klase.
print(issubclass(bool, int))
# True
print(issubclass(bool, float))
# False