У цій статті ми розповімо про 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>