type(), isinstance() zum Abrufen und Bestimmen des Typs in Python

Geschäft

In Python werden die eingebauten Funktionen type() und isinstance() verwendet, um den Typ eines Objekts, z. B. einer Variablen, zu ermitteln und zu überprüfen und um festzustellen, ob es von einem bestimmten Typ ist.

Die folgenden Inhalte werden hier zusammen mit einem Beispielcode erläutert.

  • Objekttyp abfragen und prüfen:type()
  • Bestimmung des Objekttyps:type(),isinstance()
    • Typbestimmung mit type()
    • Typbestimmung mit isinstance()
    • Unterschied zwischen type() und isinstance()

Anstatt den Typ eines Objekts zu bestimmen, kann man die Ausnahmebehandlung oder die eingebaute Funktion hasattr() verwenden, um festzustellen, ob ein Objekt die richtigen Methoden und Attribute hat.

Objekttyp abfragen und prüfen: Typ()

type(object) ist eine Funktion, die den Typ des Objekts zurückgibt, das als Argument übergeben wurde. Sie kann verwendet werden, um den Typ eines Objekts herauszufinden.

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

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

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

Der Rückgabewert von type() ist ein Typobjekt wie str oder int.

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

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

Bestimmung des Objekttyps: type(), isinstance()

Verwenden Sie type() oder isinstance(), um den Typ zu bestimmen.

Typbestimmung mit type()

Durch Vergleich des Rückgabewerts von type() mit einem beliebigen Typ kann festgestellt werden, ob das Objekt von beliebigem Typ ist.

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

Wenn Sie feststellen wollen, ob es sich um einen von mehreren Typen handelt, verwenden Sie den in-Operator und ein Tupel oder eine Liste mit mehreren Typen.

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

Es ist auch möglich, Funktionen zu definieren, die die Verarbeitung in Abhängigkeit vom Argumenttyp ändern.

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

Typbestimmung mit isinstance()

isinstance(object, class) ist eine Funktion, die true zurückgibt, wenn das Objekt des ersten Arguments eine Instanz des Typs oder der Unterklasse des zweiten Arguments ist.

Das zweite Argument kann ein Tupel von Typen sein. Wenn es eine Instanz eines der beiden Typen ist, wird true zurückgegeben.

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

print(isinstance(100, str))
# False

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

Eine Funktion, die dem Beispiel der Typbestimmung mit type() ähnelt, kann wie folgt geschrieben werden

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

Unterschied zwischen type() und isinstance()

Der Unterschied zwischen type() und isinstance() besteht darin, dass isinstance() true für Instanzen von Unterklassen zurückgibt, die die als zweites Argument angegebene Klasse erben.

Zum Beispiel sind die folgende Oberklasse (Basisklasse) und Unterklasse (abgeleitete Klasse) definiert

class Base:
    pass

class Derive(Base):
    pass

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

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

Die Typbestimmung mit type() gibt nur dann true zurück, wenn die Typen übereinstimmen, aber isinstance() gibt auch für Superklassen true zurück.

print(type(derive) is Derive)
# True

print(type(derive) is Base)
# False

print(isinstance(derive, Derive))
# True

print(isinstance(derive, Base))
# True

Selbst bei Standardtypen, z. B. dem boolschen Typ bool (true,false), ist Vorsicht geboten. bool ist eine Unterklasse des integer-Typs, so dass isinstance() auch für einen int, von dem es geerbt wurde, true zurückgibt.

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

Wenn Sie den genauen Typ bestimmen wollen, verwenden Sie type(); wenn Sie den Typ unter Berücksichtigung der Vererbung bestimmen wollen, verwenden Sie isinstance().

Mit der eingebauten Funktion issubclass() lässt sich außerdem feststellen, ob eine Klasse eine Unterklasse einer anderen Klasse ist.

print(issubclass(bool, int))
# True

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