type(), isinstance(), aby uzyskać i określić typ w Pythonie

Biznes

W Pythonie wbudowane funkcje type() i isinstance() służą do uzyskiwania i sprawdzania typu obiektu, takiego jak zmienna, oraz do określania, czy jest on określonego typu.

Objaśniono tu następujące treści oraz podano przykładowy kod.

  • Uzyskaj i sprawdź typ obiektu:type()
  • Określenie typu obiektu:type(),isinstance()
    • Określanie typu za pomocą funkcji type()
    • Określanie typu za pomocą funkcji isinstance()
    • Różnica między type() a isinstance()

Zamiast określać typ obiektu, można użyć obsługi wyjątków lub wbudowanej funkcji hasattr(), aby określić, czy obiekt posiada odpowiednie metody i atrybuty.

Uzyskaj i sprawdź typ obiektu: type()

type(obiekt) to funkcja, która zwraca typ obiektu przekazanego jako argument. Może być używana do określania typu obiektu.

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

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

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

Wartością zwracaną przez type() jest obiekt typu, taki jak str lub int.

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

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

Określenie typu obiektu: type(), isinstance()

Użyj funkcji type() lub isinstance(), aby określić typ.

Określanie typu za pomocą funkcji type()

Porównując wartość zwracaną przez funkcję type() z dowolnym typem, można określić, czy obiekt jest dowolnego typu.

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

Jeśli chcesz określić, czy jest to jeden z kilku typów, użyj operatora in oraz tuple lub listy kilku typów.

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

Możliwe jest także definiowanie funkcji, które zmieniają sposób przetwarzania w zależności od typu argumentu.

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

Określanie typu za pomocą funkcji isinstance()

isinstance(obiekt, klasa) to funkcja, która zwraca wartość true, jeśli obiekt pierwszego argumentu jest instancją typu lub podklasy drugiego argumentu.

Drugim argumentem może być tuple typów. Jeśli jest to instancja któregoś z typów, zwracana jest wartość true.

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

print(isinstance(100, str))
# False

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

Funkcję podobną do przykładu określania typu za pomocą type() można zapisać w następujący sposób

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

Różnica między type() a isinstance()

Różnica między type() a isinstance() polega na tym, że isinstance() zwraca wartość true dla instancji podklas, które dziedziczą po klasie podanej jako drugi argument.

Na przykład zdefiniowane są następujące superklasa (klasa bazowa) i podklasa (klasa pochodna)

class Base:
    pass

class Derive(Base):
    pass

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

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

Określenie typu za pomocą type() zwraca wartość true tylko wtedy, gdy typy są zgodne, natomiast isinstance() zwraca wartość true nawet dla superklas.

print(type(derive) is Derive)
# True

print(type(derive) is Base)
# False

print(isinstance(derive, Derive))
# True

print(isinstance(derive, Base))
# True

Nawet w przypadku typów standardowych, na przykład typu boolean bool (true,false), należy zachować ostrożność. bool jest podklasą typu integer, więc funkcja isinstance() zwraca wartość true nawet dla typu int, po którym dziedziczy.

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

Jeśli chcesz określić dokładny typ, użyj funkcji type(); jeśli chcesz określić typ z uwzględnieniem dziedziczenia, użyj funkcji isinstance().

Do określania, czy klasa jest podklasą innej klasy, służy wbudowana funkcja issubclass().

print(issubclass(bool, int))
# True

print(issubclass(bool, float))
# False