tipo e isistanza in Python

In questo articolo ne parleremo type() e la funzione isinstance() in Pitone e quali sono le differenze tra tipo() E isistanza() .

Cos'è il tipo in Python?

Python ha un metodo integrato chiamato type che generalmente risulta utile per determinare il tipo della variabile utilizzata nel programma in fase di runtime. IL modo canonico per verificare il tipo inserito Pitone è riportato di seguito:

Sintassi della funzione type()

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

Esempio 1: esempio di type() con un parametro di oggetto singolo

In questo esempio, stiamo cercando di verificare il tipo di dati di ciascuna variabile, come x, s e y utilizzando funzione tipo() .

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

Produzione:

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

Esempio 2: esempio di type() con un nome, basi e parametro dict

Se è necessario verificare il tipo di un oggetto, si consiglia di utilizzare Python funzione isinstance() Invece. È perché la funzione isinstance() controlla anche se l'oggetto dato è un'istanza della sottoclasse.

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

Produzione:

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

Cos'è isinstance() in Python?

La funzione isinstance() controlla se l'oggetto (primo argomento) è un'istanza o una sottoclasse della classe info classe (secondo argomento).

Sintassi della funzione isinstance()

Sintassi: isinstance (oggetto, informazioni sulla classe)

Parametro:

  • oggetto: oggetto da controllare
  • classinfo: classe, tipo o tupla di classi e tipi

Ritorno: true se l'oggetto è un'istanza o una sottoclasse di una classe, o qualsiasi elemento della tupla false altrimenti.

Se le informazioni sulla classe non sono un tipo o una tupla di tipi, viene sollevata un'eccezione TypeError.

Esempio 1:

In questo esempio, vedremo test isinstance() per l'oggetto classe.

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

Produzione:

True False True 

Esempio 2:

In questo esempio, vedremo test isinstance() per l'oggetto intero, float e stringa.

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

Produzione:

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

Esempio 3:

In questo esempio, vedremo test isinstance() per il tupla , elenco , dizionario , E impostato oggetto.

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

Produzione:

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

Quali sono le differenze tra type() e isinstance()?

Un errore elementare che le persone commettono è usare la funzione type() dove isinstance() sarebbe più appropriato.

  • Se stai controllando se un oggetto ha un certo tipo, vuoi isinstance() poiché controlla se l'oggetto passato nel primo argomento è del tipo di uno qualsiasi degli oggetti di tipo passati nel secondo argomento. Pertanto, funziona come previsto con le sottoclassi e le classi vecchio stile, tutte con l'istanza dell'oggetto di tipo legacy.
  • type(), d'altra parte, restituisce semplicemente l'oggetto di tipo di un oggetto e confrontando ciò che restituisce con un altro oggetto di tipo si otterrà True solo quando si utilizza esattamente lo stesso oggetto di tipo su entrambi i lati. In Python, è preferibile utilizzare Duck Typing (il controllo del tipo è rinviato al runtime ed è implementato mediante digitazione dinamica o riflessione) piuttosto che ispezionare il tipo di un oggetto.

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

Produzione:

Geeksforgeeks Fox Bear 
  • Il prossimo motivo per non usarlo type() è la mancanza di supporto per l'ereditarietà .

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

Produzione:

False True True False 
  • La classe MyDict ha tutte le proprietà di un dict, senza nuovi metodi. Si comporterà esattamente come un dizionario. Ma type() non restituirà il risultato atteso. È preferibile utilizzare isinstance() in questo caso perché darà il risultato atteso:

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

Produzione:

True True False True