V tomto článku se budeme zabývat tím funkce type() a isinstance(). Krajta a jaké jsou mezi nimi rozdíly typ() a isinstance() .
Co je typ v Pythonu?
Python má vestavěnou metodu nazvanou typ, která se obecně hodí při zjišťování typu proměnné použité v programu za běhu. The kanonický způsob kontroly typu Krajta je uveden níže:
Syntaxe funkce type().
type(object) type(name, bases, dict)>
Příklad 1: Příklad type() s parametrem jednoho objektu
V tomto příkladu se snažíme zkontrolovat datový typ každé proměnné, jako jsou x, s a y pomocí funkce 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ýběr řazení
Výstup:
class 'int' class 'str' class 'list'>
Příklad 2: Příklad type() s názvem, bázemi a parametrem dict
Pokud potřebujete zkontrolovat typ objektu, doporučujeme použít Python funkce isinstance(). namísto. Je to proto, že funkce isinstance() také kontroluje, zda je daný objekt instancí podtřídy.
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))> |
>
přeškrtnutí
>
Výstup:
{'b': 12, 'a': 'Foo', '__dict__': , '__doc__': None, '__weakref__': } {'b': 12, 'a': 'Foo', '__doc__': None}>
Co je isinstance() v Pythonu?
Funkce isinstance() kontroluje, zda je objekt (první argument) instancí nebo podtřídou třídy info třídy (druhý argument).
Syntaxe funkce isinstance().
Syntax: isinstance (objekt, info o třídě)
Parametr:
- objekt : objekt ke kontrole
- classinfo : třída, typ nebo n-tice tříd a typů
Vrátit se: true, pokud je objekt instancí nebo podtřídou třídy, nebo jakýmkoli prvkem n-tice false jinak.
Pokud informace o třídě není typ nebo n-tice typů, vyvolá se výjimka TypeError.
Příklad 1:
V tomto příkladu uvidíme test isinstance() pro objekt třídy.
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ýstup:
True False True>
Příklad 2:
V tomto příkladu uvidíme test isinstance() pro 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)> |
javascriptový tisk
>
>
Výstup:
is a float: True is an integer: True is a string: True>
Příklad 3:
V tomto příkladu uvidíme test isinstance() pro tuple , seznam, slovník , a soubor 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ěk rekha
Výstup:
is a tuple: True is a set: True is a list: True is a dict: True>
Jaké jsou rozdíly mezi typem() a isinstance()?
Jedna elementární chyba, kterou lidé dělají, je použití funkce type(), kde by bylo vhodnější isinstance().
- Pokud kontrolujete, zda má objekt určitý typ, chcete isinstance(), protože kontroluje, zda objekt předaný v prvním argumentu je typu některého z objektů typu předaný ve druhém argumentu. Funguje tedy podle očekávání s podtřídami a třídami starého stylu, z nichž všechny mají instanci objektu staršího typu.
- Na druhou stranu type() jednoduše vrátí objekt typu objektu a porovnání toho, co vrátí s jiným objektem typu, bude mít hodnotu True pouze tehdy, když použijete objekt stejného typu na obou stranách. V Pythonu je vhodnější používat Duck Typing (kontrola typu je odložena na dobu běhu a je implementována pomocí dynamického psaní nebo reflexe) než prověřování 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ýstup:
Geeksforgeeks Fox Bear>
- Další důvod, proč nepoužívat type() je nedostatek podpory pro dědičnost .
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ýstup:
False True True False>
- Třída MyDict má všechny vlastnosti diktátu, bez jakýchkoli nových metod. Bude se chovat přesně jako slovník. Ale type() nevrátí očekávaný výsledek. Vhodnější je použití isinstance(). v tomto případě proto, že poskytne očekávaný výsledek:
Python3
připojení v Javě
# 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ýstup:
True True False True>