type(), isinstance() om type te krijgen en te bepalen in Python

Bedrijf

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.

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