Python issubclass() 语法
issubclass() 是 Python 的一个内置函数,它用于判断一个类是否为另一个类的子类。issubclass() 会考虑继承关系。
语法:
issubclass(class, classinfo)说明:
issubclass() 函数接收以下 2 个参数。
class(必选):是一个类名。classinfo(必选):是一个类型名、类名或者 “由类型名或类名组成的元组”。如果是元组,则会判断对象是否为元组中的元素之一。
issubclass() 函数会返回一个布尔值。
- 如果 class 是 classinfo 指定的类(或其任何一个子类)的子类,则返回 True。
- 如果 class 和 classinfo 是同一个类,也返回 True。
- 否则,返回 False。
注意:
- issubclass() 只能用于判断类与类之间的继承关系。如果你想判断一个对象实例是否是某个类的实例,应该使用 isinstance() 函数。
- 当 classinfo 是一个元组时,issubclass(cls, (type1, type2, ...)) 相当于 issubclass(cls, type1) or issubclass(cls, type2) or ...。
- 所有类都隐式地继承自 object,所以 issubclass(MyClass, object) 总是返回 True。
Python issubclass() 摘要
| 使用频率 | 中 |
|---|---|
| 官方文档 | 查看 |
Python issubclass() 示例
接下来,我们通过几个简单的例子来讲解一下 Python issubclass() 函数是如何使用的。
示例 1:issubclass() 基本用法
# 定义父类
class People:
pass
# 定义子类
class Student(People):
pass
result1 = issubclass(Student, People)
print(result1)
result2 = issubclass(People, Student)
print(result2)运行结果如下。
True
False示例 2:issubclass() 考虑继承关系
class Animal:
pass
class Dog(Animal):
pass
class Husky(Dog):
pass
result = issubclass(Husky, Animal)
print(result)运行结果如下。
True分析:
Husky 类继承自 Dog 类,而 Dog 类又继承自 Animal 类。而 issubclass() 函数是考虑继承关系的,因此 issubclass(Husky, Animal) 返回 True。
示例 3:issubclass() 的参数 subclass 是一个元组
class Animal:
pass
class Planet:
pass
class Dog(Animal):
pass
result = issubclass(Dog, (Animal, Planet))
print(result)运行结果如下。
True分析:
Dog 类继承自 Animal 类,而 Animal 属于 (Animal, Planet) 中的一个,因此 issubclass() 函数返回 True。
issubclass() 与 isinstance() 的区别
issubclass() 与 isinstance() 这 2 个函数主要区别如下:
- issubclass():判断的是类与类的关系,它会考虑类继承关系。
- isinstance():判断的是对象与类的关系,用于判断对象是否为类的实例。
示例 4:issubclass() vs isinstance()
class Parent:
pass
class Child(Parent):
pass
obj = Child()
print(issubclass(Child, Parent)) # 输出:True(类与类)
print(isinstance(obj, Parent)) # 输出:True(对象与类)运行结果如下。
True
True常见问题
1. 如何检查一个类是否为多个类的子类?
如果想要判断一个类是否是多个潜在父类中的任何一个的子类,可以将这些父类放入一个元组中,作为 issubclass() 函数的第 2 个参数。比如:
issubclass(cls, (ClassA, ClassB, ClassC))2. issubclass() 能否检查鸭子类型(Duck Typing)?
不能。issubclass() 函数仅会判断显式的继承关系。它不会检查一个类是否实现了另一个类所要求的所有方法或属性。换句话说,它不会检查 “鸭子类型” 的兼容性(如果它走起来像鸭子,叫起来像鸭子,那它就是鸭子)。
如果你想判断一个类是否 “像” 另一个类一样拥有某些方法,即检查接口实现,你需要结合使用抽象基类(Abstract Base Classes, ABCs)。Python 的 collections.abc 模块提供了许多预定义的抽象基类,例如 collections.abc.Sequence、collections.abc.Mapping 等。
3. 为什么 issubclass(int, float) 返回 False?
在 Python 中,int 和 float 都是数字类型,它们都继承自更通用的 object 基类,但在它们之间没有直接的继承关系。它们是平行的兄弟关系,而不是父子关系。
- int 继承路径:int → object。
- float 继承路径:float → object。
