type og isinstance i Python

I denne artikkelen vil vi dekke ca type() og isinstance() funksjoner i Python , og hva er forskjellene mellom type() og isinstance() .

Hva er type i Python?

Python har en innebygd metode kalt type som vanligvis kommer godt med når man finner ut hvilken type variabel som brukes i programmet under kjøretiden. De kanonisk måte å sjekke for inntasting Python er gitt nedenfor:

Syntaks for type() funksjon

type(object) type(name, bases, dict) 

Eksempel 1: Eksempel på type() med en enkeltobjektparameter

I dette eksemplet prøver vi å sjekke datatypen til hver variabel, som x, s og y ved hjelp av type() funksjon .

Python3




# Python code type() with a single object parameter> x> => 5> s> => 'geeksforgeeks'> y> => [> 1> ,> 2> ,> 3> ]> print> (> type> (x))> print> (> type> (s))> print> (> type> (y))>

Produksjon:

class 'int' class 'str' class 'list' 

Eksempel 2: Eksempel på type() med navn, baser og diktparameter

Hvis du trenger å sjekke typen til et objekt, anbefales det å bruke Python isinstance() funksjon i stedet. Det er fordi funksjonen isinstance() også sjekker om det gitte objektet er en forekomst av underklassen.

Python3




# Python code for type() with a name,> # bases and dict parameter> o1> => type> (> 'X'> , (> object> ,),> dict> (a> => 'Foo'> , b> => 12> ))> print> (> type> (o1))> print> (> vars> (o1))> class> test:> > a> => 'Foo'> b> => 12> o2> => type> (> 'Y'> , (test,),> dict> (a> => 'Foo'> , b> => 12> ))> print> (> type> (o2))> print> (> vars> (o2))>

Produksjon:

{'b': 12, 'a': 'Foo', '__dict__': , '__doc__': None, '__weakref__': } {'b': 12, 'a': 'Foo', '__doc__': None} 

Hva er isinstance() i Python?

Funksjonen isinstance() sjekker om objektet (første argument) er en forekomst eller underklasse av klassen info-klassen (andre argument).

Syntaks for funksjonen isinstance().

Syntaks: er forekomst (objekt, klasseinfo)

Parameter:

  • objekt : objekt som skal kontrolleres
  • klasseinfo : klasse, type eller tuppel av klasser og typer

Komme tilbake: sant hvis objektet er en forekomst eller underklasse av en klasse, eller et hvilket som helst element i tuple false ellers.

Hvis klasseinfo ikke er en type eller tuppel av typer, oppstår et TypeError-unntak.

Eksempel 1:

I dette eksemplet vil vi se test isinstance() for klasseobjektet.

Python3




# Python code for isinstance()> class> Test:> > a> => 5> TestInstance> => Test()> print> (> isinstance> (TestInstance, Test))> print> (> isinstance> (TestInstance, (> list> ,> tuple> )))> print> (> isinstance> (TestInstance, (> list> ,> tuple> , Test)))>

Produksjon:

True False True 

Eksempel 2:

I dette eksemplet vil vi se test isinstance() for heltall-, float- og strengobjektet.

Python3




weight> => isinstance> (> 17.9> ,> float> )> print> (> 'is a float:'> , weight)> num> => isinstance> (> 71> ,> int> )> print> (> 'is an integer:'> , num)> string> => isinstance> (> 'Geeksforgeeks'> ,> str> )> print> (> 'is a string:'> , string)>

Produksjon:

is a float: True is an integer: True is a string: True 

Eksempel 3:

I dette eksemplet vil vi se test isinstance() for tuppel , liste , ordbok , og sett gjenstand.

Python3




tuple1> => isinstance> ((> 'A'> ,> 'B'> ,> 'C'> ),> tuple> )> print> (> 'is a tuple:'> , tuple1)> set1> => isinstance> ({> 'A'> ,> 'B'> ,> 'C'> },> set> )> print> (> 'is a set:'> , set1)> list1> => isinstance> ([> 'A'> ,> 'B'> ,> 'C'> ],> list> )> print> (> 'is a list:'> , list1)> dict1> => isinstance> ({> 'A'> :> '1'> ,> 'B'> :> '2'> ,> 'C'> :> '3'> },> dict> )> print> (> 'is a dict:'> , dict1)>

Produksjon:

is a tuple: True is a set: True is a list: True is a dict: True 

Hva er forskjellene mellom type() og isinstance()?

En elementær feil folk gjør er å bruke type()-funksjonen der isinstance() ville være mer passende.

  • Hvis du sjekker for å se om et objekt har en bestemt type, vil du ha isinstance() da det sjekker om objektet som sendes i det første argumentet er av typen noen av typeobjektene som sendes i det andre argumentet. Dermed fungerer det som forventet med underklasser og klasser i gammel stil, som alle har den gamle typen objektforekomst.
  • type(), på den annen side, returnerer ganske enkelt typeobjektet til et objekt, og å sammenligne det det returnerer med et annet typeobjekt vil bare gi True når du bruker nøyaktig samme typeobjekt på begge sider. I Python er det å foretrekke å bruke Duck Typing (typekontroll er utsatt til kjøretid og implementeres ved hjelp av dynamisk skriving eller refleksjon) i stedet for å inspisere typen til et objekt.

Python3




# Python code to illustrate duck typing> class> User(> object> ):> > def> __init__(> self> , firstname):> > self> .firstname> => firstname> > @property> > def> name(> self> ):> > return> self> .firstname> class> Animal(> object> ):> > pass> class> Fox(Animal):> > name> => 'Fox'> class> Bear(Animal):> > name> => 'Bear'> # Use the .name attribute (or property) regardless of the type> for> a> in> [User(> 'Geeksforgeeks'> ), Fox(), Bear()]:> > print> (a.name)>

Produksjon:

Geeksforgeeks Fox Bear 
  • Den neste grunnen til å ikke bruke type() er mangelen på støtte for arv .

Python3




# python code to illustrate the lack of> # support for inheritance in type()> class> MyDict(> dict> ):> > '''A normal dict, that is always created with an 'initial' key'''> > def> __init__(> self> ):> > self> [> 'initial'> ]> => 'some data'> d> => MyDict()> print> (> type> (d)> => => dict> )> print> (> type> (d)> => => MyDict)> d> => dict> ()> print> (> type> (d)> => => dict> )> print> (> type> (d)> => => MyDict)>

Produksjon:

False True True False 
  • MyDict-klassen har alle egenskapene til en dict, uten noen nye metoder. Den vil oppføre seg akkurat som en ordbok. Men type() vil ikke returnere det forventede resultatet. Å bruke isinstance() er å foretrekke i dette tilfellet fordi det vil gi det forventede resultatet:

Python3




# python code to show isinstance() support> # inheritance> class> MyDict(> dict> ):> > '''A normal dict, that is always created with an 'initial' key'''> > def> __init__(> self> ):> > self> [> 'initial'> ]> => 'some data'> d> => MyDict()> print> (> isinstance> (d, MyDict))> print> (> isinstance> (d,> dict> ))> d> => dict> ()> print> (> isinstance> (d, MyDict))> print> (> isinstance> (d,> dict> ))>

Produksjon:

True True False True