type(), isinstance() za dobivanje i određivanje tipa u Pythonu

Poslovanje

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.

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