logo

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:

conversie van int naar string in Java
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))>

>

>

csma en csma-cd

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

>

Java-einde voor lus

>

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

>

>

kaart in typoscript

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


wat is een exportopdracht in Linux



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