type(), isinstance() for at få og bestemme typen i Python

Forretning

I Python bruges de indbyggede funktioner type() og isinstance() til at hente og kontrollere typen af et objekt, f.eks. en variabel, og til at bestemme, om det er af en bestemt type.

Følgende indhold forklares her, sammen med eksempler på kode.

  • Opnå og kontrollere objekttype:type()
  • Bestemmelse af objekttype:type(),isinstance()
    • Typebestemmelse ved hjælp af type()
    • Typebestemmelse ved hjælp af isinstance()
    • Forskellen mellem type() og isinstance()

I stedet for at bestemme typen af et objekt kan man bruge undtagelseshåndtering eller den indbyggede funktion hasattr() til at bestemme, om et objekt har de korrekte metoder og attributter.

Opnå og kontrollere objekttype: type()

type(object) er en funktion, der returnerer typen af det objekt, der er overgivet som argument. Dette kan bruges til at finde ud af typen af et objekt.

print(type('string'))
# <class 'str'>

print(type(100))
# <class 'int'>

print(type([0, 1, 2]))
# <class 'list'>

Returværdien af type() er et typeobjekt som f.eks. str eller int.

print(type(type('string')))
# <class 'type'>

print(type(str))
# <class 'type'>

Bestemmelse af objekttype: type(), isinstance()

Brug type() eller isinstance() til at bestemme typen.

Typebestemmelse ved hjælp af type()

Ved at sammenligne den returnerede værdi af type() med en vilkårlig type kan det bestemmes, om objektet er af en hvilken som helst type.

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

Hvis du vil bestemme, om det er en af flere typer, skal du bruge in-operatoren og en tupel eller en liste med flere typer.

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

Det er også muligt at definere funktioner, der ændrer behandlingen afhængigt af argumenttypen.

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

Typebestemmelse ved hjælp af isinstance()

isinstance(object, class) er en funktion, der returnerer sandt, hvis objektet i det første argument er en instans af typen eller underklassen i det andet argument.

Det andet argument kan være en tupel af typer. Hvis det er en instans af en af typerne, returneres true.

print(isinstance('string', str))
# True

print(isinstance(100, str))
# False

print(isinstance(100, (int, str)))
# True

En funktion, der svarer til eksemplet med typebestemmelse ved hjælp af type(), kan skrives som følger

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

Forskellen mellem type() og isinstance()

Forskellen mellem type() og isinstance() er, at isinstance() returnerer sandt for instanser af underklasser, der arver den klasse, der er angivet som det andet argument.

Der er f.eks. defineret følgende superklasse (basisklasse) og underklasse (afledt klasse)

class Base:
    pass

class Derive(Base):
    pass

base = Base()
print(type(base))
# <class '__main__.Base'>

derive = Derive()
print(type(derive))
# <class '__main__.Derive'>

Typebestemmelse ved hjælp af type() returnerer kun sandt, når typerne passer sammen, men isinstance() returnerer sandt, selv for overklasser.

print(type(derive) is Derive)
# True

print(type(derive) is Base)
# False

print(isinstance(derive, Derive))
# True

print(isinstance(derive, Base))
# True

Selv for standardtyper, f.eks. den boolske type bool (true,false), skal man være forsigtig. bool er en underklasse af integer-typen, så isinstance() returnerer sandt, selv for en int, som den er arvet fra.

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

Hvis du ønsker at bestemme den nøjagtige type, skal du bruge type(); hvis du ønsker at bestemme typen under hensyntagen til arvelighed, skal du bruge isinstance().

Den indbyggede funktion issubclass() er også til rådighed til at afgøre, om en klasse er en underklasse af en anden klasse.

print(issubclass(bool, int))
# True

print(issubclass(bool, float))
# False
Copied title and URL