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.
- class type(object) — Built-in Functions — Python 3.10.4 Documentation
- isinstance(object, classinfo) — Built-in Functions — Python 3.10.4 Documentation
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