关于python:为什么使用isInstance()而不是type()?

Why use isinstance() instead of type()?

本问题已经有最佳答案,请猛点这里访问。

我见过人们经常推荐使用isInstance()而不是type(),我觉得很奇怪,因为type()对我来说更可读。

1
2
3
4
>>> isinstance("String",str)
True
>>> type("String") is str
True

后者看起来更像Python,更清晰,而前者稍微模糊,并暗示了我的特定用途(例如,测试用户构建的类而不是内置的类型),但还有其他一些我不知道的好处吗?type()是否会导致一些不稳定的行为或错过一些比较?


让我给你一个简单的例子,为什么它们会不同:

1
2
3
4
>>> class A(object): pass
>>> class B(A) : pass
>>> a = A()
>>> b = B()

到目前为止,声明了一个变量A和一个从A派生的变量B

1
2
3
4
>>> isinstance(a, A)
True
>>> type(a) == A
True

但是

1
2
3
4
>>> isinstance(b, A)
True
>>> type(b) == A
False

您在这里排除了使用子类的可能性。

当子类满足接口时,为什么只限制自己使用一种类型?如果有人想使用class mystr(str): ...来做某些事情,您的代码仍然可以工作,不需要知道是否使用了子类。

因此,使用isinstance()是一种更为Python式的方法;您的代码应该寻找受支持的行为,而不是特定的类型。


下面是反例:

1
2
3
4
5
6
7
8
9
class A():
    pass

a = A()

>>> isinstance(a, A)
True
>>> type(a) is A
False

因此,我认为isinstance是一个更通用的。


python 2.x的基本示例:标准字符串和Unicode字符串,具有通用的基类basestring

1
2
3
4
5
6
7
s ="123"
u = u"123"
isinstance(s, str) is True
type(u) == str  # something which has string nature returns False for this test
# these tests are common-pattern in Python 2.x and behaves correctly
isinstance(s, basestring) is True
isinstance(u, basestring) is True