在Python中,内置函数type()和isinstance()被用来获取和检查一个对象的类型,比如一个变量,并确定它是否属于一个特定的类型。
- class type(object) — Built-in Functions — Python 3.10.4 Documentation
- isinstance(object, classinfo) — Built-in Functions — Python 3.10.4 Documentation
这里对以下内容进行了解释,并附有示例代码。
- 获得并检查对象类型:
type()
- 确定对象的类型:
type()
,isinstance()
- 使用type()确定类型
- 使用isinstance()确定类型
- type()和isinstance()的区别
人们可以使用异常处理或内置函数hasattr()来确定一个对象是否具有正确的方法和属性,而不是确定对象的类型。
获得并检查对象类型: 类型()
type(object)是一个函数,返回作为参数传递的对象的类型。这可以用来找出一个对象的类型。
print(type('string'))
# <class 'str'>
print(type(100))
# <class 'int'>
print(type([0, 1, 2]))
# <class 'list'>
type()的返回值是一个类型对象,如str或int。
print(type(type('string')))
# <class 'type'>
print(type(str))
# <class 'type'>
确定对象的类型: type(), isinstance()
使用type()或isinstance()来确定类型。
使用type()确定类型
通过将type()的返回值与任意类型进行比较,可以确定该对象是否属于任何类型。
print(type('string') is str)
# True
print(type('string') is int)
# False
def is_str(v):
return type(v) is str
print(is_str('string'))
# True
print(is_str(100))
# False
print(is_str([0, 1, 2]))
# False
如果你想确定它是否是几种类型中的一种,请使用in运算符和一个由几种类型组成的元组或列表。
def is_str_or_int(v):
return type(v) in (str, int)
print(is_str_or_int('string'))
# True
print(is_str_or_int(100))
# True
print(is_str_or_int([0, 1, 2]))
# False
也可以定义根据参数类型改变处理方式的函数。
def type_condition(v):
if type(v) is str:
print('type is str')
elif type(v) is int:
print('type is int')
else:
print('type is not str or int')
type_condition('string')
# type is str
type_condition(100)
# type is int
type_condition([0, 1, 2])
# type is not str or int
使用isinstance()确定类型
isinstance(object, class) 是一个函数,如果第一个参数的对象是第二个参数的类型或子类的实例,则返回真。
第二个参数可以是一个类型的元组。如果它是任一类型的实例,就会返回true。
print(isinstance('string', str))
# True
print(isinstance(100, str))
# False
print(isinstance(100, (int, str)))
# True
一个类似于使用type()确定类型的例子的函数可以写成以下样子
def is_str(v):
return isinstance(v, str)
print(is_str('string'))
# True
print(is_str(100))
# False
print(is_str([0, 1, 2]))
# False
def is_str_or_int(v):
return isinstance(v, (int, str))
print(is_str_or_int('string'))
# True
print(is_str_or_int(100))
# True
print(is_str_or_int([0, 1, 2]))
# False
def type_condition(v):
if isinstance(v, str):
print('type is str')
elif isinstance(v, int):
print('type is int')
else:
print('type is not str or int')
type_condition('string')
# type is str
type_condition(100)
# type is int
type_condition([0, 1, 2])
# type is not str or int
type()和isinstance()的区别
type()和isinstance()的区别在于,isinstance()对于继承了作为第二个参数指定的类的子类的实例返回真。
例如,定义了以下超类(基类)和子类(派生类)。
class Base:
pass
class Derive(Base):
pass
base = Base()
print(type(base))
# <class '__main__.Base'>
derive = Derive()
print(type(derive))
# <class '__main__.Derive'>
使用type()确定的类型只有在类型匹配时才会返回真,但isinstance()即使对超类也会返回真。
print(type(derive) is Derive)
# True
print(type(derive) is Base)
# False
print(isinstance(derive, Derive))
# True
print(isinstance(derive, Base))
# True
即使是标准类型,例如,布尔类型bool(true,false),也必须注意。bool是整数类型的一个子类,所以isinstance()即使对它所继承的int也会返回true。
print(type(True))
# <class 'bool'>
print(type(True) is bool)
# True
print(type(True) is int)
# False
print(isinstance(True, bool))
# True
print(isinstance(True, int))
# True
如果你想确定准确的类型,使用type();如果你想在考虑到继承的情况下确定类型,使用isinstance()。
内置函数issubclass()也被提供来确定一个类是否是另一个类的子类。
print(issubclass(bool, int))
# True
print(issubclass(bool, float))
# False