在 Python 中检查类型的规范方法是什么?

新手上路,请多包涵

如何检查对象是否属于给定类型,或者它是否继承自给定类型?

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


初学者经常错误地认为字符串 _已经是_“一个数字”——或者期望 Python 3.x input 来转换类型,或者期望像 '1' 这样的字符串 同时也是 一个整数。对于这些问题,这是错误的规范。请仔细阅读问题,然后使用 如何检查字符串是否代表数字(浮点数或整数)? , 如何将输入读取为数字? 和/或 要求用户输入,直到他们给出适当的有效响应

原文由 Herge 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 562
2 个回答

使用 isinstance 检查 o 是否是 str 或任何子类的实例 --- str

 if isinstance(o, str):

检查 o 的类型是否正好是 str , _不包括 str 的子类_:

 if type(o) is str:

上述的另一种选择:

 if issubclass(type(o), str):

有关相关信息,请参阅 Python 库参考中的 内置函数


在 Python 2 中检查字符串

对于 Python 2,这是检查 o 是否为字符串的更好方法:

 if isinstance(o, basestring):

因为这也会捕获 Unicode 字符串。 unicode 不是 str 的子类;而 strunicode 都是 basestring 的子类。在 Python 3 中, basestring 不再存在,因为字符串( str )和二进制数据( bytes是严格分开 的。

或者, isinstance 接受一个类的元组。这将返回 True 如果 o 是任何 (str, unicode) 的任何子类的实例:

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

原文由 Fredrik Johansson 发布,翻译遵循 CC BY-SA 4.0 许可协议

检查对象类型的 Pythonic 方法是……不检查它。

由于 Python 鼓励 Duck Typing ,您应该 try...except 以您想要的方式使用对象的方法。因此,如果您的函数正在寻找可写文件对象, 请不要 检查它是否是 file 的子类,只需尝试使用它的 .write() 方法!

当然,有时这些漂亮的抽象会分解,而 isinstance(obj, cls) 正是您所需要的。但要谨慎使用。

原文由 Dan Lenski 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题