Из этого поста - Что такое канонический способ проверки типа в Python?, я мог бы использовать этот код для проверки объекта o типа string.

o = "str"; print type(o) is str --> True

Однако с пользовательским типом type(a) is A, похоже, не работает.

class A:
    def hello(self):
        print "A.hello"
a = A()

print type(a) is A # --> False
print type(a) == A # --> False

Почему это? Как я могу получить правильную проверку типа для определенного пользователем типа? Я использую Python 2.7 на Mac OS X.

PS: это вопрос из любопытства, так как я получил этот пример из этой книги чтобы получить истину в результате, но я получил ложь. Я понимаю, что типизация Duck является предпочтительным способом в Python. (https://stackoverflow.com/a/154156/260127)

ADDED

Ответ Родриго работает для меня. Использование isinstance не дает мне точного типа, оно просто проверяет, является ли объект экземпляром класса или подкласса.

class C(A):
    def hello(self):
        print "C.hello"

a = A()
c = C()

print isinstance(a, A) --> True
print isinstance(c, A) --> True
print isinstance(a, C) --> False
print isinstance(c, C) --> True
print "----"
print type(a) == A --> True
print type(c) == A --> False

ДОБАВЛЕНО 2

Ответ jdurango (a.__class__ is A) дал мне довольно интересный эквивалент Java.

a.getClass() == A.class <--> a.__class__ == A (a.__class__ is A)
a isinstance A <--> isinstance(a, A)
c isinstance A <--> isinstance(c, A)

Я не знаю, какие именно скопировали.

9
prosseek 3 Фев 2013 в 04:21

4 ответа

Лучший ответ

Вы должны использовать классы нового стиля:

class A(object):
    pass

То есть, выведите его из object.

Проблема в том, что объект старого стиля реализован так, как если бы все они были типа instance.

Прямое или косвенное получение object решит эту проблему. Или перейти на Python3, где больше нет классов в старом стиле.

14
rodrigo 3 Фев 2013 в 00:30

Почему бы не использовать isinstance(instance, class)?

>>> class A:
...     def hello(self):
...        print "A.hello"
... 
>>> type(A)
<type 'classobj'>
>>> a = A()
>>> type(a)
<type 'instance'>
>>> isinstance(a, A)
True
7
inspectorG4dget 3 Фев 2013 в 00:46

Если вы определяете a как a = A(), то a является экземпляром класса A. Если вы просто делаете a = A, тогда имя a указывает на объект класса.

Вы, вероятно, хотите экземпляр A и можете проверить это с

>>> a = A()
>>> isinstance(a, A)
True

Новые классы стиля будут проверять True на type(A()) == A.

2
m.brindley 3 Фев 2013 в 00:41

Попробуй это

print a.__class__ is A
True
7
jdurango 3 Фев 2013 в 00:36