logo

тип і 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


substring_index в sql



# 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


параметри java за замовчуванням



# 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

як відкрити файл json




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