如何检查对象是否为给定类型,或是否从给定类型继承?

如何检查对象o是否为str类型?


初学者通常错误地期望字符串已经是“数字”——要么期望Python 3.x输入转换类型,要么期望像“1”这样的字符串同时也是整数。对于这些问题,这是错误的规范。请仔细阅读问题,然后使用How do I check if a string representative a number(float or int)?,如何将输入读取为数字?和/或询问用户输入,直到他们给出适当的有效响应。


当前回答

检查类型的一个简单方法是将其与您所知道的类型进行比较。

>>> a  = 1
>>> type(a) == type(1)
True
>>> b = 'abc'
>>> type(b) == type('')
True

其他回答

我认为最好的方法是键入好变量。您可以使用“键入”库来完成此操作。

例子:

from typing import NewType
UserId = NewType ('UserId', int)
some_id = UserId (524313`)

看见https://docs.python.org/3/library/typing.html.

isinstance(o, str)

链接到文档

在Python中,可以使用内置的isinstance()函数来检查对象是否为给定类型,或者是否从给定类型继承。

要检查对象o是否为str类型,可以使用以下代码:

if isinstance(o, str):
# o is of type str

您还可以使用type()函数检查对象类型。

if type(o) == str:
# o is of type str

还可以使用issubclass()函数检查对象是否是特定类的子类。

if issubclass(type(o),str):
# o is sub class of str

我认为使用Python这样的动态语言很酷的一点是你真的不需要检查这样的东西。

我只需要在对象上调用所需的方法并捕获AttributeError。稍后,这将允许您使用其他(看似无关的)对象调用方法,以完成不同的任务,例如模拟对象进行测试。

在使用urllib2.urlopen()从web获取数据时,我经常使用这种方法,它返回一个类似文件的对象。这又可以传递给几乎任何从文件读取的方法,因为它实现了与实际文件相同的read()方法。

但我确信使用isinstance()是有时间和地点的,否则它可能不会出现:)

如果o是str或是从str继承的类型,isinstance(o,str)将返回True。

如果且仅当o是str时,type(o)is str将返回True。如果o是从str继承的类型,则返回False。