tipas ir egzempliorius Python

Šiame straipsnyje aptarsime apie type() ir isinstance() funkcijos in Python , ir kokie yra skirtumai tipas () ir isinstance () .

Kas yra Python tipas?

„Python“ turi integruotą metodą, vadinamą tipu, kuris paprastai yra naudingas nustatant kintamojo, naudojamo programoje vykdymo metu, tipą. The kanoninis būdas patikrinti, ar įvestas Python pateikta žemiau:

Funkcijos type() sintaksė

type(object) type(name, bases, dict) 

1 pavyzdys: tipo() pavyzdys su vieno objekto parametru

Šiame pavyzdyje bandome patikrinti kiekvieno kintamojo duomenų tipą, pvz., x, s ir y naudojant type() funkcija .

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))>

Išvestis:

class 'int' class 'str' class 'list' 

2 pavyzdys: tipo() pavyzdys su pavadinimu, bazėmis ir diktatu Parametras

Jei reikia patikrinti objekto tipą, rekomenduojama naudoti Python isinstance() funkcija vietoj to. Taip yra todėl, kad funkcija isinstance () taip pat patikrina, ar nurodytas objektas yra poklasio egzempliorius.

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))>

Išvestis:

{'b': 12, 'a': 'Foo', '__dict__': , '__doc__': None, '__weakref__': } {'b': 12, 'a': 'Foo', '__doc__': None} 

Kas yra isinstance() Python?

Funkcija isinstance() patikrina, ar objektas (pirmasis argumentas) yra klasės informacijos klasės egzempliorius ar poklasis (antrasis argumentas).

Funkcijos isinstance() sintaksė

Sintaksė: instancija (objektas, informacija apie klasę)

Parametras:

  • objektas: objektas, kurį reikia patikrinti
  • classinfo : klasė, tipas arba klasių ir tipų rinkinys

Grąžinti: tiesa, jei objektas yra klasės egzempliorius ar poklasis, arba bet kuris sektos elementas false kitu atveju.

Jei klasės informacija nėra tipas ar tipų rinkinys, iškeliama TypeError išimtis.

1 pavyzdys:

Šiame pavyzdyje matysime klasės objekto test isinstance().

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)))>

Išvestis:

True False True 

2 pavyzdys:

Šiame pavyzdyje pamatysime sveikojo skaičiaus, plūduriavimo ir eilutės objekto testą isinstance().

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)>

Išvestis:

is a float: True is an integer: True is a string: True 

3 pavyzdys:

Šiame pavyzdyje matysime test isinstance(), skirtą kortele , sąrašas, žodynas , ir rinkinys objektas.

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)>

Išvestis:

is a tuple: True is a set: True is a list: True is a dict: True 

Kuo skiriasi tipas () ir isinstance ()?

Viena elementari klaida, kurią žmonės daro, yra tipo() funkcijos naudojimas, kur isinstance() būtų tinkamesnis.

  • Jei tikrinate, ar objektas turi tam tikrą tipą, norite, kad isinstance () patikrintų, ar pirmuoju argumentu perduodamas objektas yra kurio nors iš antrojo argumento tipo objektų tipo. Taigi, jis veikia taip, kaip tikėtasi su poklasiais ir seno tipo klasėmis, kurios visos turi senojo tipo objekto egzempliorių.
  • Kita vertus, type () tiesiog grąžina objekto tipo objektą, o palyginus tai, ką jis grąžina su kito tipo objektu, bus gauta tik True, kai naudosite tiksliai to paties tipo objektą iš abiejų pusių. „Python“ geriau naudoti „Duck Tiping“ (tipo tikrinimas atidedamas vykdymo laikui ir įgyvendinamas naudojant dinaminį įvedimą arba atspindį), o ne tikrinant objekto tipą.

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)>

Išvestis:

Geeksforgeeks Fox Bear 
  • Kita priežastis nenaudoti tipas() yra paveldėjimo paramos trūkumas .

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)>

Išvestis:

False True True False 
  • MyDict klasė turi visas dikto savybes, be jokių naujų metodų. Jis elgsis lygiai kaip žodynas. Bet type() nepateiks laukiamo rezultato. Pageidautina naudoti isinstance(). šiuo atveju, nes tai duos laukiamą 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> ))>

Išvestis:

True True False True