9

从这篇文章 -在 Python 中检查类型的规范方法是什么?,我可以使用此代码来检查对象 o 是否为字符串类型。

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

为什么是这样?如何获得用户定义类型的正确类型检查?我在 Mac OS X 上使用 python 2.7。

PS:这是出于好奇而提出的问题,因为我从这本书中得到了这个例子,结果是正确的,但我得到了错误的结果。我知道鸭子打字是python中的首选方式。(https://stackoverflow.com/a/154156/260127

添加

罗德里戈的回答对我有用。使用“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)

不知道哪个抄哪个。

4

4 回答 4

14

您应该使用新式类:

class A(object):
    pass

也就是说,从object.

问题是老式对象的实现就好像它们都是 type 一样instance

直接或间接派生object将解决此问题。或者迁移到 Python3,那里不再有旧式类。

于 2013-02-03T00:30:52.427 回答
7

为什么不使用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
于 2013-02-03T00:31:02.550 回答
7

试试这个

print a.__class__ is A
True
于 2013-02-03T00:36:10.387 回答
2

如果您正在定义alike a = A()thena是 class 的一个实例A。如果您只是在做a = A,那么名称a指向类对象。

您可能想要一个实例,A然后可以使用

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

新样式类将测试 True 到type(A()) == A

于 2013-02-03T00:32:03.867 回答