Как сравнить тип объекта в Python? - PullRequest
144 голосов
/ 02 апреля 2009

В основном я хочу сделать это:

obj = 'str'
type ( obj ) == string

Я пытался:

type ( obj ) == type ( string )

и это не сработало.

А как насчет других типов? Например, я не мог воспроизвести NoneType.

Ответы [ 14 ]

1 голос
/ 27 июня 2018

Используйте isinstance(object, type). Как указано выше, это легко использовать, если вы знаете правильный type, например,

isinstance('dog', str) ## gives bool True

Но для более эзотерических объектов это может быть сложно использовать. Например:

import numpy as np 
a = np.array([1,2,3]) 
isinstance(a,np.array) ## breaks

но вы можете сделать этот трюк:

y = type(np.array([1]))
isinstance(a,y) ## gives bool True 

Поэтому я рекомендую создать экземпляр переменной (в данном случае y) с типом объекта, который вы хотите проверить (например, type(np.array())), затем использовать isinstance.

1 голос
/ 01 февраля 2013

Чтобы получить тип, используйте элемент __class__, как в unknown_thing.__class__

Разговор о наборе утки здесь бесполезен, потому что он не отвечает на совершенно хороший вопрос. В моем коде приложения мне никогда не нужно знать тип чего-либо, но все равно полезно иметь способ узнать тип объекта. Иногда мне нужно получить реальный класс для проверки модульного теста. Утиная печать мешает, потому что все возможные объекты имеют одинаковый API, но только один является правильным. Кроме того, иногда я поддерживаю чужой код и не знаю, какой тип объекта мне передали. Это моя самая большая проблема с динамически типизированными языками, такими как Python. Версия 1 очень проста и быстро разрабатывается. Версия 2 - это проблема, особенно если вы не написали версию 1. Поэтому иногда, когда я работаю с функцией, которую не писал, мне нужно знать тип параметра, просто чтобы я знал какие методы я могу вызвать на это.

Здесь параметр __class__ пригодится. Это (насколько я могу судить) - лучший (возможно, единственный) способ получить тип объекта.

1 голос
/ 07 апреля 2012

Тип не работает на определенных классах. Если вы не уверены в типе объекта, используйте метод __class__, например:

>>>obj = 'a string'
>>>obj.__class__ == str
True

Также смотрите эту статью - http://www.siafoo.net/article/56

0 голосов
/ 05 мая 2016

Вы можете сравнить классы для проверки уровня.

#!/usr/bin/env python
#coding:utf8

class A(object):
    def t(self):
        print 'A'
    def r(self):
        print 'rA',
        self.t()

class B(A):
    def t(self):
        print 'B'

class C(A):
    def t(self):
        print 'C'

class D(B, C):
    def t(self):
        print 'D',
        super(D, self).t()

class E(C, B):
    pass

d = D()
d.t()
d.r()

e = E()
e.t()
e.r()

print isinstance(e, D) # False
print isinstance(e, E) # True
print isinstance(e, C) # True
print isinstance(e, B) # True
print isinstance(e, (A,)) # True
print e.__class__ >= A, #False
print e.__class__ <= C, #False
print e.__class__ <  E, #False
print e.__class__ <= E  #True
...