在Python中检查类型的标准方法是什么?

1898 投票
18 回答
1499680 浏览
提问于 2025-04-11 09:29

我怎么检查一个对象是否是某种类型,或者是否继承自某种类型呢?

我怎么检查对象 o 是否是类型 str 呢?


初学者常常错误地认为字符串已经是“数字”了——要么期待 Python 3.x 的 input 会自动转换类型,要么认为像 '1' 这样的字符串同时也是一个整数。这种想法是错误的。请仔细阅读问题,然后参考 我怎么检查一个字符串是否表示一个数字(浮点数或整数)?我怎么把输入读作数字? 和/或 如何让用户输入直到他们给出有效的响应 这些链接,选择合适的内容。

18 个回答

82

isinstance(o, str) 这个函数会返回 True,如果 o 是一个 str 类型的东西,或者是从 str 类型派生出来的其他类型。

type(o) is str 这个检查只有在 o 确实是 str 类型的时候才会返回 True。如果 o 是从 str 派生的其他类型,它就会返回 False

272

检查一个对象的类型,最“Pythonic”的方式其实是...不去检查它。

因为Python提倡一种叫做鸭子类型的方式,你应该直接尝试使用这个对象的方法,而不是先去确认它的类型。所以,如果你的函数需要一个可以写入的文件对象,不要去检查它是否是file的子类,直接试着用它的.write()方法吧!

当然,有时候这些简单的做法可能会失效,这时候你可能就需要用到isinstance(obj, cls)来检查类型了。但要尽量少用。

2225

使用 isinstance 来检查 o 是否是 str 类型或者是 str 的任何子类:

if isinstance(o, str):

如果你想检查 o 的类型是否完全是 str,也就是不包括 str 的子类,可以这样做:

if type(o) is str:

有关更多信息,可以查看 Python 文档中的 内置函数


在 Python 2 中检查字符串

在 Python 2 中,检查 o 是否是字符串的更好方法是:

if isinstance(o, basestring):

因为这样也能捕捉到 Unicode 字符串。unicode 不是 str 的子类;strunicode 都是 basestring 的子类。在 Python 3 中,basestring 不再存在,因为字符串(str)和二进制数据(bytes)之间有了严格的区分。

另外,isinstance 也可以接受一个类的元组。如果 o(str, unicode) 中任何一个类的子类的实例,这个检查会返回 True

if isinstance(o, (str, unicode)):

撰写回答