Python面向对象编程:深入解析继承与多态机制

洛溪
洛溪
发布时间:2026-10-13| 2人浏览过
原创

本文深入解析Python面向对象编程中的继承与多态。详细讲解如何定义子类继承父类属性与方法,通过isinstance和issubclass判断类型关系。重点阐述多态机制,包括子类重写父类方法实现行为差异,以及子类在新增属性时如何正确调用父类构造函数。最后介绍多重继承的优先级规则,帮助开发者理解并应用开闭原则进行可扩展的代码设计。

本文通过具体实例,详细解析Python面向对象编程中继承与多态的核心用法,旨在为读者提供清晰的参考与实践指导。

Python类的继承与多态基础

Python类的继承机制

Python类的继承机制

在面向对象编程(OOP)中,定义新类时可以从现有类继承,新类称为子类(Subclass),被继承的类称为基类、父类或超类(Base class、Super class)。

首先定义一个Person类,包含name(姓名)和sex(性别)两个属性变量。

接着定义print_title()方法:当sex为male时输出man,当sex为female时输出woman。具体代码实现如下:


class Person(object):
  def __init__(self,name,sex):
    self.name = name
    self.sex = sex
  def print_title(self):
    if self.sex == "male":
      print("man")
    elif self.sex == "female":
      print("woman")
class Child(Person):              # Child 继承 Person
  pass
May = Child("May","female")
Peter = Person("Peter","male")
print(May.name,May.sex,Peter.name,Peter.sex)  # 子类继承父类方法及属性
May.print_title()
Peter.print_title()

编写Child类时,可直接继承Person类(即Child是Person的一种)。通过class subclass_name(baseclass_name)语法表示继承关系。

继承的最大优势在于子类自动获得父类的所有属性和功能。例如,Child类无需额外定义即可直接使用父类的print_title()方法。

实例化Child对象时,由于子类继承了父类的构造函数,必须提供父类Person所要求的两个属性变量name和sex。

在继承关系中,若实例的数据类型是某个子类,则该实例也可视为父类(如May既是Child也是Person)。反之不成立(Peter仅是Person,而非Child)。

继承支持多级传递,如同从爷爷到父亲再到儿子的关系。任何类最终都可追溯至根类object,这种层级关系形似倒置的树。例如以下继承树结构:

isinstance()及issubclass()函数用法

isinstance()及issubclass()函数用法

Python与其他语言不同,定义class时即定义了一种数据类型。自定义数据类型与Python内置类型(如str、list、dict)并无本质区别。

Python提供两个判断继承关系的函数:isinstance()用于检查实例类型,issubclass()用于检查类继承关系。参考示例如下:


class Person(object):
  pass
class Child(Person):         # Child 继承 Person
  pass
May = Child()
Peter = Person()
print(isinstance(May,Child))     # True
print(isinstance(May,Person))    # True
print(isinstance(Peter,Child))    # False
print(isinstance(Peter,Person))   # True
print(issubclass(Child,Person))   # True

Python类的多态特性

Python类的多态特性

在解释多态前,先在Child类中重写print_title()方法:若sex为male则输出boy,若sex为female则输出girl。


class Person(object):
  def __init__(self,name,sex):
    self.name = name
    self.sex = sex
  def print_title(self):
    if self.sex == "male":
      print("man")
    elif self.sex == "female":
      print("woman")
class Child(Person):        # Child 继承 Person
  def print_title(self):
    if self.sex == "male":
      print("boy")
    elif self.sex == "female":
      print("girl")
May = Child("May","female")
Peter = Person("Peter","male")
print(May.name,May.sex,Peter.name,Peter.sex)
May.print_title()
Peter.print_title()

当子类与父类存在同名的print_title()方法时,子类的实现会覆盖父类的实现。代码运行时,将调用子类的print_title()方法。

由此获得继承的另一个重要好处:多态。

多态的优势在于,当需要传入更多子类(如新增Teenagers、Grownups等)时,只需继承Person类型即可。print_title()方法可选择直接继承父类(不重写),或重写为特有逻辑。调用方只需关注调用行为,无需关心内部细节。新增Person子类时,只要确保新方法编写正确,无需修改原有代码。这体现了著名的“开闭”原则:

  • 对扩展开放(Open for extension):允许子类重写方法函数
  • 对修改封闭(Closed for modification):不重写时直接继承父类方法函数

子类重写构造函数

子类重写构造函数

子类可不定义构造函数(与父类一致),也可重写构造函数。若需在子类Child中新增mother和father两个属性变量,构造方式如下(建议子类调用父类构造方法,见后续代码):


class Person(object):
  def __init__(self,name,sex):
  self.name = name
  self.sex = sex
class Child(Person):        # Child 继承 Person
  def __init__(self,name,sex,mother,father):
    self.name = name
    self.sex = sex
    self.mother = mother
    self.father = father
May = Child("May","female","April","June")
print(May.name,May.sex,May.mother,May.father)
Person

若父类构造函数包含大量属性,而子类仅需新增1、2个,直接重写会导致代码冗余。此时,子类可显式调用父类的构造方法,参考实现如下:


class Person(object):
  def __init__(self,name,sex):
    self.name = name
    self.sex = sex
class Child(Person):             # Child 继承 Person
  def __init__(self,name,sex,mother,father):
    Person.__init__(self,name,sex)    # 子类对父类的构造方法的调用
    self.mother = mother
    self.father = father
May = Child("May","female","April","June")
print(May.name,May.sex,May.mother,May.father)

多重继承

多重继承

多重继承概念直观,例如新建Baby类继承Child,可继承父类及父类上层类的属性与方法。执行时优先使用层级较近的方法,代码参考如下:


class Person(object):
  def __init__(self,name,sex):
    self.name = name
    self.sex = sex
  def print_title(self):
    if self.sex == "male":
      print("man")
    elif self.sex == "female":
      print("woman")
class Child(Person):
  pass
class Baby(Child):
  pass
May = Baby("May","female")    # 继承上上层父类的属性
print(May.name,May.sex)
May.print_title()         # 可使用上上层父类的方法
class Child(Person):
  def print_title(self):
    if self.sex == "male":
      print("boy")
    elif self.sex == "female":
      print("girl")
class Baby(Child):
  pass
May = Baby("May","female")
May.print_title()        # 优先使用上层类的方法

更多关于Python相关内容感兴趣的读者可查看本站专题:《Python面向对象程序设计入门与进阶教程》、《Python数据结构与算法教程》、《Python函数使用技巧总结》、《Python字符串操作技巧汇总》、《Python编码操作技巧总结》及《Python入门与进阶经典教程》

希望本文所述对大家Python程序设计有所帮助。

相关标签:

免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。

Python 相关产品和应用

全部下载
Selenium

Selenium

4.51.0 · Windows

用于浏览器自动化和 Web 测试的 Python 工具。

scikit-learn

scikit-learn

1.9.1 · Windows

常用 Python 机器学习算法与模型评估工具库。

Black

Black

26.10.1 · Windows

强调一致性的 Python 自动代码格式化工具。

Ruff

Ruff

0.17.1 · macOS

由 Rust 编写的高速 Python 代码检查和格式化工具。

pytest

pytest

9.1.1 · Windows

简洁而强大的 Python 自动化测试框架。

FastAPI

FastAPI

0.146.0 · Windows

高性能 Python API 框架,支持类型提示和自动接口文档。

Flask

Flask

3.1.3 · Windows

轻量灵活的 Python Web 应用框架。

Django

Django

6.1.2 · Windows

成熟的 Python Web 框架,适合构建内容站点和业务系统。

Spyder

Spyder

6.1.7 · Windows

面向科学计算与数据分析的 Python 集成开发环境。

SciPy

SciPy

1.18.1 · Windows

面向科学、工程和技术计算的 Python 算法库。