
Python 提供了多种类型判断方法,每种方法的场景也不同。主要分为类型检查(运行时判断) 和**类型提示(静态检查)**两大类。
一、运行时类型判断
1. type():查看对象类型
type() 返回对象的确切类型。
print(type(42)) # <class 'int'>
print(type(3.14)) # <class 'float'>
print(type("hello")) # <class 'str'>
print(type([1, 2, 3])) # <class 'list'>
print(type({"a": 1})) # <class 'dict'>
# 判断是否等于某个类型
if type(value) == int:
print("这是整数")
注意 :type() 在继承关系中不会考虑子类,它返回的是对象的具体类型,而不是继承链。
class Animal:
pass
class Dog(Animal):
pass
dog = Dog()
print(type(dog)) # <class '__main__.Dog'>
print(type(dog) == Dog) # True
print(type(dog) == Animal) # False(Dog 不是 Animal)
2. isinstance():判断是否属于某个类型(推荐)
isinstance() 会检查对象的类型是否与指定类型匹配,包括父类。
class Animal:
pass
class Dog(Animal):
pass
dog = Dog()
print(isinstance(dog, Dog)) # True
print(isinstance(dog, Animal)) # True(Dog 是 Animal 的子类)
print(isinstance(dog, object)) # True(所有类都继承 object)
print(isinstance(42, int)) # True
print(isinstance(42, (int, float)))# True(元组表示任一类型)
| 方法 | 是否考虑继承关系 | 推荐度 |
|---|---|---|
type(obj) == cls |
不考虑 | 不推荐 |
isinstance(obj, cls) |
考虑 | 推荐 |
3. issubclass():判断类继承关系
class Animal:
pass
class Dog(Animal):
pass
class Cat(Animal):
pass
print(issubclass(Dog, Animal)) # True
print(issubclass(Cat, Animal)) # True
print(issubclass(Dog, Cat)) # False
print(issubclass(Dog, (Cat, Animal))) # True(任一匹配)
4. callable():判断是否可调用
def my_func():
pass
class MyClass:
def method(self):
pass
print(callable(my_func)) # True
print(callable(MyClass)) # True
print(callable(MyClass.method)) # True(未绑定的方法)
print(callable(42)) # False
print(callable("hello")) # False
5. 检查可迭代对象
from collections.abc import Iterable
print(isinstance([1, 2, 3], Iterable)) # True
print(isinstance("hello", Iterable)) # True
print(isinstance(42, Iterable)) # False
对比总结
| 方法 | 用途 | 适用场景 |
|---|---|---|
type(obj) |
获取对象的确切类型 | 需要精确判断类型时 |
isinstance(obj, cls) |
判断对象是否属于某个类型(包括父类) | 推荐,大多数场景 |
issubclass(cls1, cls2) |
判断类继承关系 | 检查类是否派生自另一个类 |
callable(obj) |
判断对象是否可调用 | 检查函数、方法等 |
hasattr(obj, attr) |
判断对象是否有某个属性/方法 | 鸭子类型检查 |
type hints |
类型注解 | 静态类型检查(不运行) |