如何检查对象是否为给定类型,或是否从给定类型继承?
如何检查对象o是否为str类型?
初学者通常错误地期望字符串已经是“数字”——要么期望Python 3.x输入转换类型,要么期望像“1”这样的字符串同时也是整数。对于这些问题,这是错误的规范。请仔细阅读问题,然后使用How do I check if a string representative a number(float or int)?,如何将输入读取为数字?和/或询问用户输入,直到他们给出适当的有效响应。
如何检查对象是否为给定类型,或是否从给定类型继承?
如何检查对象o是否为str类型?
初学者通常错误地期望字符串已经是“数字”——要么期望Python 3.x输入转换类型,要么期望像“1”这样的字符串同时也是整数。对于这些问题,这是错误的规范。请仔细阅读问题,然后使用How do I check if a string representative a number(float or int)?,如何将输入读取为数字?和/或询问用户输入,直到他们给出适当的有效响应。
当前回答
在Python中,可以使用内置的isinstance()函数来检查对象是否为给定类型,或者是否从给定类型继承。
要检查对象o是否为str类型,可以使用以下代码:
if isinstance(o, str):
# o is of type str
您还可以使用type()函数检查对象类型。
if type(o) == str:
# o is of type str
还可以使用issubclass()函数检查对象是否是特定类的子类。
if issubclass(type(o),str):
# o is sub class of str
其他回答
检查对象类型的最Python方法是……不检查它。
既然Python鼓励Duck打字,那么您应该尝试。。。除了按照您想要的方式使用对象的方法。因此,如果您的函数正在寻找一个可写的文件对象,不要检查它是否是文件的子类,只需尝试使用它的.write()方法!
当然,有时这些好的抽象会崩溃,而isinstance(obj,cls)正是您所需要的。但要谨慎使用。
我认为使用Python这样的动态语言很酷的一点是你真的不需要检查这样的东西。
我只需要在对象上调用所需的方法并捕获AttributeError。稍后,这将允许您使用其他(看似无关的)对象调用方法,以完成不同的任务,例如模拟对象进行测试。
在使用urllib2.urlopen()从web获取数据时,我经常使用这种方法,它返回一个类似文件的对象。这又可以传递给几乎任何从文件读取的方法,因为它实现了与实际文件相同的read()方法。
但我确信使用isinstance()是有时间和地点的,否则它可能不会出现:)
在Python中,可以使用内置的isinstance()函数来检查对象是否为给定类型,或者是否从给定类型继承。
要检查对象o是否为str类型,可以使用以下代码:
if isinstance(o, str):
# o is of type str
您还可以使用type()函数检查对象类型。
if type(o) == str:
# o is of type str
还可以使用issubclass()函数检查对象是否是特定类的子类。
if issubclass(type(o),str):
# o is sub class of str
我认为最好的方法是键入好变量。您可以使用“键入”库来完成此操作。
例子:
from typing import NewType
UserId = NewType ('UserId', int)
some_id = UserId (524313`)
看见https://docs.python.org/3/library/typing.html.
使用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的子类。在Python3中,basestring不再存在,因为字符串(str)和二进制数据(字节)有严格的分隔。
或者,isinstance接受一个类元组。如果o是(str,unicode)的任何子类的实例,则返回True:
if isinstance(o, (str, unicode)):