type(), isinstance() za pridobitev in določitev tipa v Pythonu

Posel

V Pythonu se vgrajeni funkciji type() in isinstance() uporabljata za pridobivanje in preverjanje tipa predmeta, na primer spremenljivke, ter za ugotavljanje, ali je predmet določenega tipa.

Tu je razložena naslednja vsebina skupaj z vzorčno kodo.

  • Pridobite in preverite tip predmeta:type()
  • Določitev vrste predmeta:type(),isinstance()
    • Določanje tipa z uporabo type()
    • Določanje tipa s funkcijo isinstance()
    • Razlika med funkcijama type() in isinstance()

Namesto določanja tipa predmeta lahko za ugotavljanje, ali ima predmet pravilne metode in atribute, uporabite obravnavo izjem ali vgrajeno funkcijo hasattr().

Pridobite in preverite tip predmeta: tip()

type(object) je funkcija, ki vrne tip predmeta, posredovanega kot argument. Uporabite jo lahko za ugotavljanje tipa predmeta.

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

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

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

Vrnjena vrednost funkcije type() je objekt tipa, na primer str ali int.

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

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

Določitev vrste predmeta: type(), isinstance()

Za določitev tipa uporabite type() ali isinstance().

Določanje tipa z uporabo type()

S primerjavo povratne vrednosti type() s poljubnim tipom lahko ugotovimo, ali je predmet katerega koli tipa.

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

Če želite ugotoviti, ali gre za eno od več vrst, uporabite operator in in tuple ali seznam več vrst.

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

Prav tako je mogoče definirati funkcije, ki spreminjajo obdelavo glede na vrsto argumenta.

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

Določanje tipa s funkcijo isinstance()

isinstance(object, class) je funkcija, ki vrne true, če je objekt prvega argumenta primerek tipa ali podrazreda drugega argumenta.

Drugi argument je lahko tuple tipov. Če je primerek katerega koli tipa, se vrne true.

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

print(isinstance(100, str))
# False

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

Funkcijo, podobno kot v primeru določanja tipa z ukazom type(), lahko zapišemo na naslednji način

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

Razlika med funkcijama type() in isinstance()

Razlika med type() in isinstance() je v tem, da isinstance() vrne true za primere podrazredov, ki podedujejo razred, določen kot drugi argument.

Na primer, opredeljena sta naslednji nadrazred (osnovni razred) in podrazred (izpeljani razred)

class Base:
    pass

class Derive(Base):
    pass

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

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

Določanje tipov z metodo type() vrne true le, če se tipa ujemata, funkcija isinstance() pa vrne true tudi za nadrazrede.

print(type(derive) is Derive)
# True

print(type(derive) is Base)
# False

print(isinstance(derive, Derive))
# True

print(isinstance(derive, Base))
# True

Tudi pri standardnih tipih, na primer logičnem tipu bool (true,false), je treba biti previden. bool je podrazred tipa integer, zato funkcija isinstance() vrne true tudi za tip int, od katerega je podedovan.

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

Če želite določiti točen tip, uporabite tip(); če želite določiti tip z upoštevanjem dedovanja, uporabite isinstance().

Vgrajena funkcija issubclass() je na voljo tudi za ugotavljanje, ali je razred podrazred drugega razreda.

print(issubclass(bool, int))
# True

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