V Pythonu se vgrajeni funkciji type() in isinstance() uporabljata za pridobivanje in preverjanje tipa predmeta, na primer spremenljivke, ter za ugotavljanje, ali je predmet določenega tipa.
- class type(object) — Built-in Functions — Python 3.10.4 Documentation
- isinstance(object, classinfo) — Built-in Functions — Python 3.10.4 Documentation
Tu je razložena naslednja vsebina skupaj z vzorčno kodo.
- Pridobite in preverite tip predmeta:
type()
- Določitev vrste predmeta:
type()
,isinstance()
- Določanje tipa z uporabo type()
- Določanje tipa s funkcijo isinstance()
- Razlika med funkcijama type() in isinstance()
Namesto določanja tipa predmeta lahko za ugotavljanje, ali ima predmet pravilne metode in atribute, uporabite obravnavo izjem ali vgrajeno funkcijo hasattr().
Pridobite in preverite tip predmeta: tip()
type(object) je funkcija, ki vrne tip predmeta, posredovanega kot argument. Uporabite jo lahko za ugotavljanje tipa predmeta.
print(type('string'))
# <class 'str'>
print(type(100))
# <class 'int'>
print(type([0, 1, 2]))
# <class 'list'>
Vrnjena vrednost funkcije type() je objekt tipa, na primer str ali int.
print(type(type('string')))
# <class 'type'>
print(type(str))
# <class 'type'>
Določitev vrste predmeta: type(), isinstance()
Za določitev tipa uporabite type() ali isinstance().
Določanje tipa z uporabo type()
S primerjavo povratne vrednosti type() s poljubnim tipom lahko ugotovimo, ali je predmet katerega koli tipa.
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
Če želite ugotoviti, ali gre za eno od več vrst, uporabite operator in in tuple ali seznam več vrst.
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
Prav tako je mogoče definirati funkcije, ki spreminjajo obdelavo glede na vrsto 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
Določanje tipa s funkcijo isinstance()
isinstance(object, class) je funkcija, ki vrne true, če je objekt prvega argumenta primerek tipa ali podrazreda drugega argumenta.
Drugi argument je lahko tuple tipov. Če je primerek katerega koli tipa, se vrne true.
print(isinstance('string', str))
# True
print(isinstance(100, str))
# False
print(isinstance(100, (int, str)))
# True
Funkcijo, podobno kot v primeru določanja tipa z ukazom type(), lahko zapišemo na naslednji 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 med funkcijama type() in isinstance()
Razlika med type() in isinstance() je v tem, da isinstance() vrne true za primere podrazredov, ki podedujejo razred, določen kot drugi argument.
Na primer, opredeljena sta naslednji nadrazred (osnovni razred) in podrazred (izpeljani razred)
class Base:
pass
class Derive(Base):
pass
base = Base()
print(type(base))
# <class '__main__.Base'>
derive = Derive()
print(type(derive))
# <class '__main__.Derive'>
Določanje tipov z metodo type() vrne true le, če se tipa ujemata, funkcija isinstance() pa vrne true tudi za nadrazrede.
print(type(derive) is Derive)
# True
print(type(derive) is Base)
# False
print(isinstance(derive, Derive))
# True
print(isinstance(derive, Base))
# True
Tudi pri standardnih tipih, na primer logičnem tipu bool (true,false), je treba biti previden. bool je podrazred tipa integer, zato funkcija isinstance() vrne true tudi za tip int, od katerega je podedovan.
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
Če želite določiti točen tip, uporabite tip(); če želite določiti tip z upoštevanjem dedovanja, uporabite isinstance().
Vgrajena funkcija issubclass() je na voljo tudi za ugotavljanje, ali je razred podrazred drugega razreda.
print(issubclass(bool, int))
# True
print(issubclass(bool, float))
# False