在Python中检查类型的标准方法是什么?
我怎么检查一个对象是否是某种类型,或者是否继承自某种类型呢?
我怎么检查对象 o
是否是类型 str
呢?
初学者常常错误地认为字符串已经是“数字”了——要么期待 Python 3.x 的 input
会自动转换类型,要么认为像 '1'
这样的字符串同时也是一个整数。这种想法是错误的。请仔细阅读问题,然后参考 我怎么检查一个字符串是否表示一个数字(浮点数或整数)?、我怎么把输入读作数字? 和/或 如何让用户输入直到他们给出有效的响应 这些链接,选择合适的内容。
18 个回答
isinstance(o, str)
这个函数会返回 True
,如果 o
是一个 str
类型的东西,或者是从 str
类型派生出来的其他类型。
type(o) is str
这个检查只有在 o
确实是 str
类型的时候才会返回 True
。如果 o
是从 str
派生的其他类型,它就会返回 False
。
检查一个对象的类型,最“Pythonic”的方式其实是...不去检查它。
因为Python提倡一种叫做鸭子类型的方式,你应该直接尝试使用这个对象的方法,而不是先去确认它的类型。所以,如果你的函数需要一个可以写入的文件对象,不要去检查它是否是file
的子类,直接试着用它的.write()
方法吧!
当然,有时候这些简单的做法可能会失效,这时候你可能就需要用到isinstance(obj, cls)
来检查类型了。但要尽量少用。
使用 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
的子类;str
和 unicode
都是 basestring
的子类。在 Python 3 中,basestring
不再存在,因为字符串(str
)和二进制数据(bytes
)之间有了严格的区分。
另外,isinstance
也可以接受一个类的元组。如果 o
是 (str, unicode)
中任何一个类的子类的实例,这个检查会返回 True
:
if isinstance(o, (str, unicode)):