type en isinstance in Python

In dit artikel zullen we het hebben over type() en isinstance() functioneren in Python , en wat zijn de verschillen tussen type() En isinstance() .

Wat is type in Python?

Python heeft een ingebouwde methode genaamd type, die over het algemeen van pas komt bij het uitzoeken van het type variabele dat in het programma tijdens de runtime wordt gebruikt. De canonieke manier om te controleren op type-in Python staat hieronder:

Syntaxis van de functie type().

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

Voorbeeld 1: Voorbeeld van type() met een enkele objectparameter

In dit voorbeeld proberen we het gegevenstype van elke variabele te controleren, zoals x, s en y gebruiken type() functie .

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

Uitgang:

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

Voorbeeld 2: Voorbeeld van type() met een naam, basen en dict-parameter

Als u het type van een object wilt controleren, wordt aanbevolen om Python te gebruiken isinstance()-functie in plaats van. Dit komt omdat de functie isinstance() ook controleert of het gegeven object een instantie van de subklasse is.

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

Uitgang:

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

Wat is isinstance() in Python?

De functie isinstance() controleert of het object (eerste argument) een instantie of subklasse is van de klasse info-klasse (tweede argument).

Syntaxis van de functie isinstance().

Syntaxis: isinstantie (object, klasseinfo)

Parameter:

  • object : object dat moet worden gecontroleerd
  • classinfo : klasse, type of tupel van klassen en typen

Opbrengst: true als het object een instantie of subklasse van een klasse is, of anders een element van de tupel false.

Als klasse-info geen type of tupel van typen is, wordt er een TypeError-uitzondering gegenereerd.

Voorbeeld 1:

In dit voorbeeld zien we test isinstance() voor het klasseobject.

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

Uitgang:

True False True 

Voorbeeld 2:

In dit voorbeeld zien we test isinstance() voor het object geheel getal, float en 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)>

Uitgang:

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

Voorbeeld 3:

In dit voorbeeld zien we test isinstance() voor de tupel , lijst , woordenboek , En set voorwerp.

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

Uitgang:

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

Wat zijn de verschillen tussen type() en isinstance()?

Een elementaire fout die mensen maken is het gebruik van de functie type() waarbij isinstance() geschikter zou zijn.

  • Als je controleert of een object een bepaald type heeft, wil je dat isinstance() controleert of het object dat in het eerste argument wordt doorgegeven, van het type is van een van de typeobjecten die in het tweede argument worden doorgegeven. Het werkt dus zoals verwacht met subklassen en klassen in de oude stijl, die allemaal de objectinstantie van het oudere type hebben.
  • type() daarentegen retourneert eenvoudigweg het type-object van een object, en het vergelijken van wat het retourneert met een ander type-object levert alleen True op als u aan beide kanten exact hetzelfde type-object gebruikt. In Python verdient het de voorkeur Duck Typing te gebruiken (typecontrole wordt uitgesteld tot runtime en wordt geïmplementeerd door middel van dynamisch typen of reflectie) in plaats van het type van een object te inspecteren.

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

Uitgang:

Geeksforgeeks Fox Bear 
  • De volgende reden om het niet te gebruiken type() is het gebrek aan ondersteuning voor overerving .

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

Uitgang:

False True True False 
  • De klasse MyDict heeft alle eigenschappen van een dictaat, zonder nieuwe methoden. Het zal zich precies gedragen als een woordenboek. Maar type() levert niet het verwachte resultaat op. Het gebruik van isinstance() heeft de voorkeur in dit geval omdat het het verwachte resultaat oplevert:

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

Uitgang:

True True False True