type i isinstancja w Pythonie

W tym artykule omówimy type() i isinstance() w Pyton i jakie są między nimi różnice typ() I isinstancja() .

Co to jest typ w Pythonie?

Python ma wbudowaną metodę zwaną typem, która zazwyczaj przydaje się przy ustalaniu typu zmiennej używanej w programie w czasie jego wykonywania. The kanoniczny sposób sprawdzania wpisania Pyton podano poniżej:

Składnia funkcji type().

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

Przykład 1: Przykład type() z pojedynczym parametrem obiektu

W tym przykładzie staramy się sprawdzić typ danych każdej zmiennej, takie jak x, s i y przy użyciu funkcja typu(). .

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

Wyjście:

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

Przykład 2: Przykład type() z nazwą, bazami i parametrem dict

Jeśli chcesz sprawdzić typ obiektu, zaleca się użycie języka Python funkcja isinstancja(). Zamiast. Dzieje się tak, ponieważ funkcja isinstance() sprawdza również, czy dany obiekt jest instancją podklasy.

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

Wyjście:

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

Co to jest isinstance() w Pythonie?

Funkcja isinstance() sprawdza, czy obiekt (pierwszy argument) jest instancją lub podklasą klasy informacyjnej klasy (drugi argument).

Składnia funkcji isinstance().

Składnia: jest instancją (obiekt, informacje o klasie)

Parametr:

  • obiekt : obiekt do sprawdzenia
  • classinfo : klasa, typ lub krotka klas i typów

Powrót: true, jeśli obiekt jest instancją lub podklasą klasy, lub dowolnym elementem krotki, false w przeciwnym razie.

Jeśli informacje o klasie nie są typem ani krotką typów, zgłaszany jest wyjątek TypeError.

Przykład 1:

W tym przykładzie zobaczymy test isinstance() dla obiektu klasy.

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

Wyjście:

True False True 

Przykład 2:

W tym przykładzie zobaczymy test isinstance() dla obiektu typu integer, float i 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)>

Wyjście:

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

Przykład 3:

W tym przykładzie zobaczymy test isinstance() dla krotka , lista , słownik , I ustawić obiekt.

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

Wyjście:

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

Jakie są różnice między type() a isinstance()?

Jednym z podstawowych błędów popełnianych przez ludzi jest użycie funkcji type(), gdzie bardziej odpowiednia byłaby funkcja isinstance().

  • Jeśli chcesz sprawdzić, czy obiekt ma określony typ, użyj metody isinstance(), która sprawdza, czy obiekt przekazany w pierwszym argumencie jest typu dowolnego z obiektów typu przekazanych w drugim argumencie. Zatem działa zgodnie z oczekiwaniami z podklasami i klasami w starym stylu, z których wszystkie mają instancję obiektu starszego typu.
  • type(), z drugiej strony, po prostu zwraca obiekt typu obiektu, a porównanie tego, co zwraca z obiektem innego typu, da wartość True tylko wtedy, gdy użyjesz dokładnie tego samego obiektu typu po obu stronach. W Pythonie lepiej jest używać Duck Typing (sprawdzanie typu jest odraczane do czasu wykonania i jest realizowane za pomocą dynamicznego pisania lub refleksji), zamiast sprawdzać typ obiektu.

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

Wyjście:

Geeksforgeeks Fox Bear 
  • Następny powód, aby nie używać type() to brak obsługi dziedziczenia .

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

Wyjście:

False True True False 
  • Klasa MyDict ma wszystkie właściwości słownika, bez żadnych nowych metod. Będzie się zachowywał dokładnie tak, jak słownik. Ale type() nie zwróci oczekiwanego wyniku. Preferowane jest użycie isinstance(). w tym przypadku, ponieważ da oczekiwany wynik:

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

Wyjście:

True True False True