I Python används de inbyggda funktionerna type() och isinstance() för att ta fram och kontrollera typen av ett objekt, t.ex. en variabel, och för att avgöra om den är av en viss typ.
- class type(object) — Built-in Functions — Python 3.10.4 Documentation
- isinstance(object, classinfo) — Built-in Functions — Python 3.10.4 Documentation
Följande innehåll förklaras här, tillsammans med exempelkod.
- Upptäcka och kontrollera objekttyp:
type()
- Fastställande av objekttyp:
type()
,isinstance()
- Typbestämning med hjälp av type()
- Typbestämning med hjälp av isinstance()
- Skillnaden mellan type() och isinstance()
Istället för att bestämma ett objekts typ kan man använda undantagshantering eller den inbyggda funktionen hasattr() för att avgöra om ett objekt har rätt metoder och attribut.
Upptäcka och kontrollera objekttyp: typ()
type(object) är en funktion som returnerar typen av det objekt som överlämnats som argument. Detta kan användas för att ta reda på typen av ett objekt.
print(type('string'))
# <class 'str'>
print(type(100))
# <class 'int'>
print(type([0, 1, 2]))
# <class 'list'>
Returvärdet av type() är ett typobjekt, t.ex. str eller int.
print(type(type('string')))
# <class 'type'>
print(type(str))
# <class 'type'>
Fastställande av objekttyp: type(), isinstance()
Använd type() eller isinstance() för att bestämma typen.
Typbestämning med hjälp av type()
Genom att jämföra returvärdet av type() med en godtycklig typ kan man avgöra om objektet är av vilken typ som helst.
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
Om du vill avgöra om det är en av flera typer använder du in-operatören och en tupel eller lista med flera 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 är också möjligt att definiera funktioner som ändrar behandling beroende på argumenttyp.
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
Typbestämning med hjälp av isinstance()
isinstance(object, class) är en funktion som returnerar sant om objektet i det första argumentet är en instans av typen eller underklassen i det andra argumentet.
Det andra argumentet kan vara en tupel av typer. Om det är en instans av någon av typerna returneras true.
print(isinstance('string', str))
# True
print(isinstance(100, str))
# False
print(isinstance(100, (int, str)))
# True
En funktion som liknar exemplet med typbestämning med hjälp av type() kan skrivas på följande sätt
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
Skillnaden mellan type() och isinstance()
Skillnaden mellan type() och isinstance() är att isinstance() returnerar sant för instanser av underklasser som ärver den klass som anges som det andra argumentet.
Till exempel definieras följande superklass (basklass) och subklass (härledd klass)
class Base:
pass
class Derive(Base):
pass
base = Base()
print(type(base))
# <class '__main__.Base'>
derive = Derive()
print(type(derive))
# <class '__main__.Derive'>
Typbestämning med hjälp av type() returnerar sant endast när typerna stämmer överens, men isinstance() returnerar sant även för överklasser.
print(type(derive) is Derive)
# True
print(type(derive) is Base)
# False
print(isinstance(derive, Derive))
# True
print(isinstance(derive, Base))
# True
Även när det gäller standardtyper, t.ex. den boolska typen bool (true,false), måste man vara försiktig. bool är en underklass till heltalstypen, så isinstance() returnerar sant även för en int som den ärvs från.
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
Om du vill bestämma den exakta typen använder du type(); om du vill bestämma typen med hänsyn till arv använder du isinstance().
Den inbyggda funktionen issubclass() finns också för att avgöra om en klass är en underklass till en annan klass.
print(issubclass(bool, int))
# True
print(issubclass(bool, float))
# False