logo

type a isinstance v Pythonu

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>