在Python中检查类型的规范方法是什么?
检查给定对象是否为给定类型的最佳方法是什么?如何检查对象是否从给定类型继承?
假设我有一个对象" o"。如何检查它是否为" str"?
解决方案
isinstance(o, str)
链接到文档
如果o是str或者从str继承的类型,则isinstance(o,str)将返回true。
当且仅当o是一个str时,type(o)是str才返回true。如果o的类型是从str继承的,它将返回false。 -
要检查o是str的实例还是str的任何子类,请使用isinstance(这是"规范"的方式):
if isinstance(o, str):
要检查o的类型是否恰好是str:
if type(o) is str:
以下内容也可以使用,并且在某些情况下可能有用:
if issubclass(type(o), str):
有关相关信息,请参见《 Python库参考》中的内置函数。
还有一点要注意:在这种情况下,如果我们使用的是python 2,则实际上可能要使用:
if isinstance(o, basestring):
因为这也会捕获Unicode字符串(unicode不是str的子类; str和unicode都是basestring的子类)。请注意," basestring"在python 3中不再存在,在Python 3中,字符串(str
)和二进制数据(bytes
)严格分开。
另外,isinstance
接受一个类的元组。如果x是(str,unicode)中任何一个的任何子类的实例,则将返回True:
if isinstance(o, (str, unicode)):
我认为使用像Python这样的动态语言的很酷的事情是,我们真的不必检查类似的东西。
我只会在对象上调用所需的方法,并捕获一个" AttributeError"。稍后,这将允许我们与其他(看似无关)对象一起调用方法以完成不同的任务,例如模拟一个对象进行测试。
当我使用urllib2.urlopen()
从网络上获取数据时,我经常使用它,它返回一个类似object的文件。这又可以传递给几乎所有从文件读取的方法,因为它实现了与真实文件相同的read()
方法。
但是我敢肯定会有一个时间和地点来使用isinstance()
,否则它可能就不会出现了:)
检查对象类型的最Pythonic方法是...不检查它。
由于Python鼓励使用Duck Typing,因此我们应该只尝试使用对象的方法来使用它们。因此,如果函数正在寻找可写文件对象,则不要检查它是否是file
的子类,只需尝试使用其.write()
方法即可!
当然,有时这些漂亮的抽象会分解,而isinstance(obj,cls)`是我们所需要的。但是要谨慎使用。