V tem članku bomo obravnavali približno type() in isinstance() delujeta v Python , in kakšne so razlike med tip() in isinstance() .
Kaj je tip v Pythonu?
Python ima vgrajeno metodo, imenovano type, ki je običajno uporabna pri ugotavljanju vrste spremenljivke, uporabljene v programu v času izvajanja. The kanoničen način preverjanja vnosa Python je podan spodaj:
Sintaksa funkcije type().
type(object) type(name, bases, dict)>
Primer 1: Primer type() z enim parametrom objekta
V tem primeru poskušamo preveriti vrsto podatkov vsake spremenljivke, kot so x, s in y z uporabo funkcijo type(). .
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))> |
>
>
Izhod:
class 'int' class 'str' class 'list'>
Primer 2: Primer type() z imenom, osnovami in parametrom dict
Če morate preveriti vrsto predmeta, je priporočljivo uporabiti Python funkcijo isinstance(). namesto tega. To je zato, ker funkcija isinstance() tudi preveri, ali je dani predmet primerek podrazreda.
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))> |
>
>
Izhod:
{'b': 12, 'a': 'Foo', '__dict__': , '__doc__': None, '__weakref__': } {'b': 12, 'a': 'Foo', '__doc__': None}> Kaj je isinstance() v Pythonu?
Funkcija isinstance() preveri, ali je predmet (prvi argument) primerek ali podrazred razreda info o razredu (drugi argument).
Sintaksa funkcije isinstance().
Sintaksa: je primer (predmet, informacije o razredu)
Parameter:
- predmet : predmet, ki ga je treba preveriti
- classinfo : razred, tip ali nabor razredov in tipov
Vrnitev: true, če je objekt primerek ali podrazred razreda, ali kateri koli element tuple false drugače.
Če informacije o razredu niso vrsta ali množica vrst, se sproži izjema TypeError.
Primer 1:
V tem primeru bomo videli test isinstance() za objekt razreda.
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)))> |
>
>
Izhod:
True False True>
Primer 2:
V tem primeru bomo videli test isinstance() za celo število, float in objekt niza.
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)> |
>
>
Izhod:
is a float: True is an integer: True is a string: True>
Primer 3:
V tem primeru bomo videli test isinstance() za tuple , seznam , slovar , in set predmet.
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)> |
>
>
Izhod:
is a tuple: True is a set: True is a list: True is a dict: True>
Kakšne so razlike med type() in isinstance()?
Ena elementarna napaka, ki jo ljudje delajo, je uporaba funkcije type(), kjer bi bil isinstance() primernejši.
- Če preverjate, ali ima predmet določeno vrsto, želite isinstance(), saj preverja, ali je predmet, posredovan v prvem argumentu, vrste katerega koli od predmetov vrste, posredovanih v drugem argumentu. Tako deluje po pričakovanjih s podrazredi in razredi starega sloga, ki imajo vsi primerek predmeta podedovanega tipa.
- type() po drugi strani preprosto vrne tipski objekt predmeta in primerjava tega, kar vrne z drugim tipskim objektom, bo dala True le, če na obeh straneh uporabite povsem isti tipski objekt. V Pythonu je bolje uporabiti Duck Typing (preverjanje tipa je odloženo na čas izvajanja in se izvaja s pomočjo dinamičnega tipkanja ali refleksije), namesto da bi pregledali vrsto predmeta.
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)> |
>
>
arraylist v Javi
Izhod:
Geeksforgeeks Fox Bear>
- Naslednji razlog za neuporabo type() je pomanjkanje podpore za dedovanje .
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)> |
>
>
Izhod:
False True True False>
- Razred MyDict ima vse lastnosti dikta brez novih metod. Obnašal se bo natanko tako kot slovar. Vendar tip() ne bo vrnil pričakovanega rezultata. Zaželena je uporaba isinstance(). v tem primeru, ker bo dal pričakovan rezultat:
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>))> |
>
>
Izhod:
True True False True>