type a isinstance v Pythone
V tomto článku sa budeme zaoberať vo funkcii type() a isinstance(). Python a aké sú medzi nimi rozdiely typ() a isinstance() .
Čo je typ v Pythone?
Python má vstavanú metódu s názvom type, ktorá sa vo všeobecnosti hodí pri zisťovaní typu premennej použitej v programe za behu. The kanonický spôsob kontroly zadania Python je uvedené nižšie:
Syntax funkcie type().
type(object) type(name, bases, dict)
Príklad 1: Príklad type() s parametrom jedného objektu
V tomto príklade sa snažíme skontrolovať typ údajov každej premennej, ako sú x, s a y pomocou funkcia 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))> |
Výkon:
class 'int' class 'str' class 'list'
Príklad 2: Príklad type() s názvom, základmi a parametrom dict
Ak potrebujete skontrolovať typ objektu, odporúča sa použiť Python funkcia isinstance(). namiesto toho. Je to preto, že funkcia isinstance() tiež kontroluje, či daný objekt je inštanciou podtriedy.
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))> |
Výkon:
{'b': 12, 'a': 'Foo', '__dict__': , '__doc__': None, '__weakref__': } {'b': 12, 'a': 'Foo', '__doc__': None} Čo je isinstance() v Pythone?
Funkcia isinstance() kontroluje, či objekt (prvý argument) je inštanciou alebo podtriedou triedy info o triede (druhý argument).
Syntax funkcie isinstance().
Syntax: isinstance (objekt, info o triede)
Parameter:
- objekt : objekt, ktorý sa má skontrolovať
- classinfo : trieda, typ alebo n-tica tried a typov
Návrat: true, ak je objekt inštanciou alebo podtriedou triedy, alebo ktorýkoľvek prvok n-tice false inak.
Ak informácie o triede nie sú typom alebo n-ticou typov, vyvolá sa výnimka TypeError.
Príklad 1:
V tomto príklade uvidíme test isinstance() pre objekt triedy.
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)))> |
Výkon:
True False True
Príklad 2:
V tomto príklade uvidíme test isinstance() pre objekt typu integer, float a string.
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)> |
Výkon:
is a float: True is an integer: True is a string: True
Príklad 3:
V tomto príklade uvidíme test isinstance() pre násobný , zoznam , slovník , a nastaviť 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)> |
Výkon:
is a tuple: True is a set: True is a list: True is a dict: True
Aké sú rozdiely medzi typom () a isinstance ()?
Jednou zo základných chýb, ktoré ľudia robia, je použitie funkcie type(), kde by bola vhodnejšia isinstance().
- Ak kontrolujete, či objekt má určitý typ, chcete isinstance(), pretože kontroluje, či objekt odovzdaný v prvom argumente je typu niektorého z typov objektov odovzdaných v druhom argumente. Funguje teda podľa očakávania s podtriedami a triedami starého štýlu, z ktorých všetky majú inštanciu objektu staršieho typu.
- Na druhej strane type() jednoducho vráti typ objektu a porovnanie toho, čo vráti s iným typovým objektom, prinesie hodnotu True iba vtedy, keď použijete presne ten istý typ objektu na oboch stranách. V Pythone je vhodnejšie použiť Duck Typing (kontrola typu je odložená na čas spustenia a je implementovaná pomocou dynamického písania alebo reflexie) namiesto kontroly typu objektu.
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)> |
Výkon:
Geeksforgeeks Fox Bear
- Ďalší dôvod nepoužívať type() je nedostatok podpory pre dedičstvo .
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)> |
Výkon:
False True True False
- Trieda MyDict má všetky vlastnosti diktátu, bez akýchkoľvek nových metód. Bude sa správať presne ako slovník. Type() však nevráti očakávaný výsledok. Uprednostňuje sa použitie isinstance(). v tomto prípade, pretože poskytne očakávaný výsledok:
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> ))> |
Výkon:
True True False True