Python作为一种解释性语言,其强大的动态类型机制允许我们在运行时动态的改变变量的类型,这对程序员来说是非常方便的,但同时也带来了类型安全的问题。如果程序员没有很好的把握好变量的类型,可能会带来类型错误的问题,而这可能会导致程序无法运行或产生错误的结果。而一些高级语言也提供了一些类型检查的工具来帮助程序员尽可能地规避这些问题。Python中isinstance就是其中一种工具,下面我们将从多个方面来介绍isinstance函数的类型判断作用。
一、基本使用方法
isinstance(obj,cls)函数是判断obj是否是cls的实例对象的方法。其中,obj表示待判断对象,cls表示待判断的类名或类型的元组。如果obj是cls的实例,返回True,否则返回False。
class Person: pass class Student(Person): pass s1 = Student() print(isinstance(s1, Student)) # True print(isinstance(s1, Person)) # True print(isinstance(s1, str)) # False
通过上面的代码,我们可以看到,s1既是Student的实例,也是Person的实例,同时也清楚的看到字符串不是它的实例。
二、类型检查的嵌套调用
isinstance函数不仅支持单类型判断,而且还支持对元组的类型检查。
l = ["hello", "world"] print(isinstance(l, list)) # True print(isinstance(l, (list, tuple))) # True print(isinstance(l, (list, dict))) # True d = {"key": "value"} print(isinstance(d, dict)) # True print(isinstance(d, (list, dict))) # True print(isinstance(d, (list, tuple))) # False
通过上述例子,我们可以看到一个元素可以属于一个基本类型,同时也可以被多种不同类型的元素包含,这也是isinstance相较与其它语言类型安全检查的重要性。
三、一些特殊的类型判断
isinstance函数不仅可以用于基本数据类型的判断,还可以用于一些特殊数据类型的判断。下面介绍几个实际工作中常见的类型判断。
1. 确定对象是否可以迭代
from collections.abc import Iterable s = 'hello world' print(isinstance(s, Iterable)) # True l = [1, 2, 3] print(isinstance(l, Iterable)) # True d = {"key": "value"} print(isinstance(d, Iterable)) # True i = 10 print(isinstance(i, Iterable)) # False num = (1, 2, 3) print(isinstance(num, Iterable)) # True
通过上述代码,我们可以发现,字符串、列表、字典以及元组都是可以迭代的,但整数不可以被迭代。
2. 确定对象是否可以被调用
l = ["hello", "world"] def func(x): return x print(isinstance(l, Callable)) # False print(isinstance(func, Callable)) # True
通过上述代码,我们可以发现,函数本身也是一种类型,称为Callable。函数可以被调用,而列表不可以。
3. 判断对象是否可以遍历
from collections import Iterator s = 'hello world' print(isinstance(s, Iterator)) # False l = [1, 2, 3] print(isinstance(l, Iterator)) # True num = (1, 2, 3) print(isinstance(num, Iterator)) # True i = iter(num) print(isinstance(i, Iterator)) # True d = {"key": "value"} print(isinstance(d, Iterator)) # False
通过上述代码,我们可以发现,除了字符串之外,其他的列表、元组和迭代器都是可以遍历的。
总结
本文从基本使用方法、类型检查的嵌套调用到一些特殊的类型判断多个方面详细介绍了Python内置函数isinstance的类型判断作用。对于一个程序员来说,了解这些相关知识将会帮助我们在日常工作中更加高效地解决问题,减少包器的bug率。