type(), isinstance() per obtenir i determinar el tipus a Python

Negocis

A Python, les funcions integrades type() i isinstance() s’utilitzen per obtenir i comprovar el tipus d’un objecte, com ara una variable, i per determinar si és d’un tipus particular.

Aquí s’explica el contingut següent, juntament amb el codi d’exemple.

  • Obtenir i comprovar el tipus d’objecte:type()
  • Determinació del tipus d’objecte:type(),isinstance()
    • Determinació del tipus mitjançant type()
    • Determinació del tipus mitjançant isinstance()
    • Diferència entre type() i isinstance()

En lloc de determinar el tipus d’objecte, es pot utilitzar el maneig d’excepcions o la funció integrada hasattr() per determinar si un objecte té els mètodes i atributs correctes.

Obtenir i comprovar el tipus d’objecte:tipus ()

tipus(objecte) és una funció que retorna el tipus de l’objecte passat com a argument. Això es pot utilitzar per esbrinar el tipus d’objecte.

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

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

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

El valor de retorn de type() és un objecte tipus com str o int.

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

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

Determinació del tipus d’objecte:type(),isinstance()

Utilitzeu type() o isinstance() per determinar el tipus.

Determinació del tipus mitjançant type()

En comparar el valor de retorn de type() amb un tipus arbitrari, es pot determinar si l’objecte és de qualsevol tipus.

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

Si voleu determinar si és un de diversos tipus, utilitzeu l’operador in i una tupla o llista de diversos tipus.

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

També és possible definir funcions que canvien de processament en funció del tipus d’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

Determinació del tipus mitjançant isinstance()

isinstance(objecte, classe) és una funció que retorna true si l’objecte del primer argument és una instància del tipus o subclasse del segon argument.

El segon argument pot ser una tupla de tipus. Si és una instància de qualsevol tipus, es retorna true.

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

print(isinstance(100, str))
# False

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

Una funció similar a l’exemple de determinació de tipus mitjançant type() es pot escriure de la següent manera

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

Diferència entre type() i isinstance()

La diferència entre type() i isinstance() és que isinstance() retorna cert per a les instàncies de subclasses que hereten la classe especificada com a segon argument.

Per exemple, es defineixen la superclasse (classe base) i la subclasse (classe derivada) següents

class Base:
    pass

class Derive(Base):
    pass

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

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

La determinació del tipus utilitzant type() només retorna true quan els tipus coincideixen, però isinstance() retorna true fins i tot per a les superclasses.

print(type(derive) is Derive)
# True

print(type(derive) is Base)
# False

print(isinstance(derive, Derive))
# True

print(isinstance(derive, Base))
# True

Fins i tot per als tipus estàndard, per exemple, el tipus booleà bool (true,false), cal tenir cura. bool és una subclasse de tipus enter, de manera que isinstance() retorna true fins i tot per a un int del qual s’hereta.

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

Si voleu determinar el tipus exacte, utilitzeu type(); si voleu determinar el tipus amb l’herència en compte, utilitzeu isinstance().

La funció integrada issubclass() també es proporciona per determinar si una classe és una subclasse d’una altra classe.

print(issubclass(bool, int))
# True

print(issubclass(bool, float))
# False