In Python worden de ingebouwde functies type() en isinstance() gebruikt om het type van een object, zoals een variabele, te verkrijgen en te controleren, en om te bepalen of het van een bepaald type is.
- class type(object) — Built-in Functions — Python 3.10.4 Documentation
- isinstance(object, classinfo) — Built-in Functions — Python 3.10.4 Documentation
De volgende inhoud wordt hier uitgelegd, samen met voorbeeldcode.
- Verkrijgen en controleren van objecttype:
type()
- Bepaling van het objecttype:
type()
,isinstance()
- Typebepaling met type()
- Typebepaling met behulp van isinstance()
- Verschil tussen type() en isinstance()
In plaats van het type van een object te bepalen, kan men exception handling of de ingebouwde functie hasattr() gebruiken om te bepalen of een object de juiste methoden en attributen heeft.
Verkrijgen en controleren van objecttype: type()
type(object) is een functie die het type van het object dat als argument wordt doorgegeven, teruggeeft. Dit kan worden gebruikt om het type van een object te achterhalen.
print(type('string'))
# <class 'str'>
print(type(100))
# <class 'int'>
print(type([0, 1, 2]))
# <class 'list'>
De terugkeerwaarde van type() is een type-object zoals str of int.
print(type(type('string')))
# <class 'type'>
print(type(str))
# <class 'type'>
Bepaling van het objecttype: type(), isinstance()
Gebruik type() of isinstance() om het type te bepalen.
Typebepaling met type()
Door de returnwaarde van type() te vergelijken met een willekeurig type, kan bepaald worden of het object van een willekeurig type is.
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
Als je wil bepalen of het één van meerdere types is, gebruik je de in operator en een tupel of lijst van meerdere types.
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
Het is ook mogelijk om functies te definiëren die de verwerking veranderen afhankelijk van het type argument.
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
Typebepaling met behulp van isinstance()
isinstance(object, klasse) is een functie die waar teruggeeft indien het object van het eerste argument een instantie is van het type of de subklasse van het tweede argument.
Het tweede argument kan een tupel van types zijn. Als het een instantie van een van beide types is, wordt waar teruggegeven.
print(isinstance('string', str))
# True
print(isinstance(100, str))
# False
print(isinstance(100, (int, str)))
# True
Een functie die lijkt op het voorbeeld van typebepaling met type() kan als volgt worden geschreven
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
Verschil tussen type() en isinstance()
Het verschil tussen type() en isinstance() is dat isinstance() waar teruggeeft voor instanties van subklassen die erven van de klasse die als tweede argument wordt opgegeven.
Bijvoorbeeld, de volgende superclass (basisklasse) en subclass (afgeleide klasse) zijn gedefinieerd
class Base:
pass
class Derive(Base):
pass
base = Base()
print(type(base))
# <class '__main__.Base'>
derive = Derive()
print(type(derive))
# <class '__main__.Derive'>
Typebepaling met type() geeft alleen true terug als de types overeenkomen, maar isinstance() geeft zelfs true terug voor superklasses.
print(type(derive) is Derive)
# True
print(type(derive) is Base)
# False
print(isinstance(derive, Derive))
# True
print(isinstance(derive, Base))
# True
Zelfs voor standaard types, bijvoorbeeld het booleaanse type bool (true,false), moet voorzichtig te werk gegaan worden. bool is een subklasse van het integer type, dus isinstance() geeft true terug, zelfs voor een int waarvan het geërfd is.
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
Als je het exacte type wilt bepalen, gebruik je type(); als je het type wilt bepalen rekening houdend met overerving, gebruik je isinstance().
De ingebouwde functie issubclass() is ook beschikbaar om te bepalen of een klasse een subklasse is van een andere klasse.
print(issubclass(bool, int))
# True
print(issubclass(bool, float))
# False