python中用户定义的类型检查:"type(A())是A"返回false

pro*_*eek 9 python types

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

o = "str"; print type(o) is str --> True
Run Code Online (Sandbox Code Playgroud)

但是,使用用户定义的类型,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
Run Code Online (Sandbox Code Playgroud)

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

PS:这是一个出于好奇的问题,因为我从这本书中得到了这个例子,结果是真实的,但我得到了错误.我知道Duck打字是python中的首选方式.(/sf/answers/10790951/)

添加

罗德里戈的回答对我有用.使用'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
Run Code Online (Sandbox Code Playgroud)

增加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)
Run Code Online (Sandbox Code Playgroud)

我不知道哪个复制哪个.

rod*_*igo 14

你应该使用新式的类:

class A(object):
    pass
Run Code Online (Sandbox Code Playgroud)

也就是说,从中衍生出来object.

问题是旧式对象的实现就好像所有对象都是类型一样instance.

直接或间接导出object将解决此问题.或者转到Python3,那里没有旧式的类.

  • +1用于解释两种风格之间的差异. (2认同)

Dus*_*tin 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
Run Code Online (Sandbox Code Playgroud)


jdu*_*ngo 7

试试这个

print a.__class__ is A
True
Run Code Online (Sandbox Code Playgroud)