Python issubclass() 函数

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。

上一篇: isinstance()

下一篇: callable()

给站长反馈

绿叶网正在不断完善中,小伙伴们如果发现任何问题,还望多多给站长反馈,谢谢!

邮箱:lvyenet@vip.qq.com

「绿叶网」服务号
绿叶网服务号放大
关注服务号,微信也能看教程。
绿叶网服务号