тип і isinstance у Python

У цій статті ми розповімо про type() і isinstance() функції в Python , і які відмінності між тип() і isinstance() .

Що таке тип у Python?

У Python є вбудований метод під назвою type, який зазвичай стає в нагоді під час визначення типу змінної, яка використовується в програмі під час виконання. The канонічний спосіб перевірки введення Python наведено нижче:

Синтаксис функції type().

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

Приклад 1: Приклад type() з одним параметром об’єкта

У цьому прикладі ми намагаємося перевірити тип даних кожної змінної, наприклад x, s і y за допомогою функція type(). .

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

Вихід:

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

Приклад 2: Приклад type() із назвою, базами та параметром dict

Якщо вам потрібно перевірити тип об'єкта, рекомендується використовувати Python функція isinstance(). замість цього. Це тому, що функція isinstance() також перевіряє, чи є даний об’єкт екземпляром підкласу.

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

Вихід:

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

Що таке isinstance() у Python?

Функція isinstance() перевіряє, чи є об’єкт (перший аргумент) екземпляром або підкласом інформаційного класу класу (другий аргумент).

Синтаксис функції isinstance().

Синтаксис: це екземпляр (об'єкт, інформація про клас)

Параметр:

  • object : об'єкт для перевірки
  • classinfo : клас, тип або кортеж класів і типів

Повернення: true, якщо об'єкт є екземпляром або підкласом класу, або будь-яким елементом кортежу, false в іншому випадку.

Якщо інформація про клас не є типом або кортежем типів, виникає виняток TypeError.

Приклад 1:

У цьому прикладі ми побачимо перевірку 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)))>

Вихід:

True False True 

приклад 2:

У цьому прикладі ми побачимо перевірку isinstance() для об’єктів типу integer, float і 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)>

Вихід:

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

приклад 3:

У цьому прикладі ми побачимо перевірку isinstance() для кортеж , список , словник , і встановити об'єкт.

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

Вихід:

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

Які відмінності між type() і isinstance()?

Однією з елементарних помилок, які люди роблять, є використання функції type(), де isinstance() було б більш доречним.

  • Якщо ви перевіряєте, чи має об’єкт певний тип, вам потрібен isinstance(), оскільки він перевіряє, чи є об’єкт, переданий у першому аргументі, типу будь-якого з об’єктів типу, переданих у другому аргументі. Таким чином, він працює належним чином із підкласами та класами старого стилю, усі з яких мають екземпляр об’єкта застарілого типу.
  • type(), з іншого боку, просто повертає об’єкт типу об’єкта, і порівняння того, що він повертає з іншим об’єктом типу, дасть True лише тоді, коли ви використовуєте той самий об’єкт типу з обох сторін. У Python краще використовувати Duck Typing (перевірку типу відкладено до часу виконання та реалізовано за допомогою динамічного введення або відображення), а не перевіряти тип об’єкта.

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

Вихід:

Geeksforgeeks Fox Bear 
  • Наступна причина не використовувати type() – це відсутність підтримки успадкування .

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

Вихід:

False True True False 
  • Клас MyDict має всі властивості dict без жодних нових методів. Він буде поводитися точно так само, як словник. Але type() не поверне очікуваного результату. Бажано використовувати isinstance(). у цьому випадку, оскільки це дасть очікуваний результат:

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

Вихід:

True True False True