În Python, funcțiile încorporate type() și isinstance() sunt utilizate pentru a obține și verifica tipul unui obiect, cum ar fi o variabilă, și pentru a determina dacă acesta este de un anumit tip.
- class type(object) — Built-in Functions — Python 3.10.4 Documentation
- isinstance(object, classinfo) — Built-in Functions — Python 3.10.4 Documentation
Următorul conținut este explicat aici, împreună cu exemple de cod.
- Obținerea și verificarea tipului de obiect:
type()
- Determinarea tipului de obiect:
type()
,isinstance()
- Determinarea tipului utilizând type()
- Determinarea tipului utilizând isinstance()
- Diferența dintre type() și isinstance()
În loc să se determine tipul unui obiect, se poate utiliza gestionarea excepțiilor sau funcția încorporată hasattr() pentru a determina dacă un obiect are metodele și atributele corecte.
Obținerea și verificarea tipului de obiect: tip()
type(object) este o funcție care returnează tipul obiectului trecut ca argument. Aceasta poate fi utilizată pentru a afla tipul unui obiect.
print(type('string'))
# <class 'str'>
print(type(100))
# <class 'int'>
print(type([0, 1, 2]))
# <class 'list'>
Valoarea returnată de type() este un obiect de tip, cum ar fi str sau int.
print(type(type('string')))
# <class 'type'>
print(type(str))
# <class 'type'>
Determinarea tipului de obiect: type(), isinstance()
Utilizați type() sau isinstance() pentru a determina tipul.
Determinarea tipului utilizând type()
Comparând valoarea returnată de type() cu un tip arbitrar, se poate determina dacă obiectul este de orice tip.
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
Dacă doriți să determinați dacă este unul dintre mai multe tipuri, utilizați operatorul in și un tupluplu sau o listă de mai multe tipuri.
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
De asemenea, este posibil să se definească funcții care să modifice procesarea în funcție de tipul de argument.
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
Determinarea tipului utilizând isinstance()
isinstance(object, class) este o funcție care returnează true dacă obiectul din primul argument este o instanță a tipului sau a subclasei celui de-al doilea argument.
Al doilea argument poate fi un tandem de tipuri. Dacă este o instanță a oricărui tip, se returnează true.
print(isinstance('string', str))
# True
print(isinstance(100, str))
# False
print(isinstance(100, (int, str)))
# True
O funcție similară cu exemplul de determinare a tipului folosind type() poate fi scrisă după cum urmează
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
Diferența dintre type() și isinstance()
Diferența dintre type() și isinstance() este că isinstance() returnează true pentru instanțele de subclase care moștenesc clasa specificată ca al doilea argument.
De exemplu, sunt definite următoarele superclasă (clasă de bază) și subclasă (clasă derivată)
class Base:
pass
class Derive(Base):
pass
base = Base()
print(type(base))
# <class '__main__.Base'>
derive = Derive()
print(type(derive))
# <class '__main__.Derive'>
Determinarea tipului utilizând type() returnează true numai atunci când tipurile se potrivesc, dar isinstance() returnează true chiar și pentru superclase.
print(type(derive) is Derive)
# True
print(type(derive) is Base)
# False
print(isinstance(derive, Derive))
# True
print(isinstance(derive, Base))
# True
Chiar și pentru tipurile standard, de exemplu, tipul boolean bool (true,false), trebuie avut grijă. bool este o subclasă a tipului integer, astfel încât isinstance() returnează true chiar și pentru un int din care este moștenit.
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
Dacă doriți să determinați tipul exact, utilizați type(); dacă doriți să determinați tipul cu luarea în considerare a moștenirii, utilizați isinstance().
Funcția încorporată issubclass() este, de asemenea, prevăzută pentru a determina dacă o clasă este o subclasă a unei alte clase.
print(issubclass(bool, int))
# True
print(issubclass(bool, float))
# False