type(), isinstance()来获取和确定Python中的类型

商业

在Python中,内置函数type()和isinstance()被用来获取和检查一个对象的类型,比如一个变量,并确定它是否属于一个特定的类型。

这里对以下内容进行了解释,并附有示例代码。

  • 获得并检查对象类型: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