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

时间:2020-03-06 14:55:02  来源:igfitidea点击:

检查给定对象是否为给定类型的最佳方法是什么?如何检查对象是否从给定类型继承?

假设我有一个对象" 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)`是我们所需要的。但是要谨慎使用。