type og isinstance i Python
I denne artikel vil vi dække ca type() og isinstance() fungerer i Python , og hvad er forskellene mellem type() og isinstance() .
Hvad er type i Python?
Python har en indbygget metode kaldet type, som generelt er praktisk, mens man finder ud af typen af den variabel, der bruges i programmet under kørsel. Det kanonisk måde at tjekke for indtastning Python er givet nedenfor:
Syntaks for type() funktion
type(object) type(name, bases, dict)
Eksempel 1: Eksempel på type() med en enkelt objektparameter
I dette eksempel forsøger vi at kontrollere datatypen for hver variabel, såsom x, s og y ved hjælp af type() funktion .
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))> |
Produktion:
class 'int' class 'str' class 'list'
Eksempel 2: Eksempel på type() med et navn, baser og diktparameter
Hvis du har brug for at kontrollere typen af et objekt, anbefales det at bruge Python isinstance() funktion i stedet. Det er fordi isinstance()-funktionen også kontrollerer, om det givne objekt er en forekomst af 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))> |
Produktion:
{'b': 12, 'a': 'Foo', '__dict__': , '__doc__': None, '__weakref__': } {'b': 12, 'a': 'Foo', '__doc__': None} Hvad er isinstance() i Python?
Funktionen isinstance() kontrollerer, om objektet (første argument) er en forekomst eller underklasse af klassen info-klassen (andet argument).
Syntaks for funktionen isinstance().
Syntaks: er eksempel (objekt, klasseinfo)
Parameter:
- objekt : objekt, der skal kontrolleres
- klasseinfo: klasse, type eller række af klasser og typer
Vend tilbage: sand, hvis objektet er en forekomst eller underklasse af en klasse, eller ethvert element af tuple false ellers.
Hvis klasseoplysninger ikke er en type eller en række af typer, opstår der en TypeError-undtagelse.
Eksempel 1:
I dette eksempel 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)))> |
Produktion:
True False True
Eksempel 2:
I dette eksempel vil vi se test isinstance() for objektet heltal, float og streng.
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)> |
Produktion:
is a float: True is an integer: True is a string: True
Eksempel 3:
I dette eksempel vil vi se test isinstance() for tupel , liste, ordbog , og sæt objekt.
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)> |
Produktion:
is a tuple: True is a set: True is a list: True is a dict: True
Hvad er forskellene mellem type() og isinstance()?
En elementær fejl, folk laver, er at bruge type()-funktionen, hvor isinstance() ville være mere passende.
- Hvis du tjekker for at se, om et objekt har en bestemt type, vil du have isinstance(), da det kontrollerer, om objektet, der sendes i det første argument, er af typen som et af de typeobjekter, der sendes i det andet argument. Det fungerer således som forventet med subclassing og old-style klasser, som alle har den gamle type objektforekomst.
- type(), på den anden side, returnerer blot et objekts typeobjekt, og sammenligning af, hvad det returnerer med et andet typeobjekt, vil kun give True, når du bruger nøjagtigt samme typeobjekt på begge sider. I Python er det at foretrække at bruge Duck Typing (typekontrol udskydes til kørselstid og implementeres ved hjælp af dynamisk indtastning eller refleksion) frem for at inspicere typen af 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)> |
Produktion:
Geeksforgeeks Fox Bear
- Den næste grund til ikke at bruge type() er manglen på støtte til 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)> |
Produktion:
False True True False
- MyDict-klassen har alle egenskaberne for en dict uden nye metoder. Det vil opføre sig præcis som en ordbog. Men type() vil ikke returnere det forventede resultat. Brug af isinstance() er at foretrække i dette tilfælde, fordi det vil give det forventede resultat:
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> ))> |
Produktion:
True True False True