Python面向对象编程:类的继承机制详解

远山来客
远山来客
发布时间:2026-10-14| 6人浏览过
原创

本文深入解析Python面向对象编程中的类继承机制。详细阐述实现继承与接口继承的区别,讲解经典类与新式类在构造函数继承上的写法差异(如super函数的使用),并通过代码示例演示子类对父类方法的重写及属性扩展。内容涵盖继承的定义、构造过程及实际应用场景,帮助开发者掌握从一般到特殊的类层次化设计。

一、概述

面向对象编程(OOP)的核心特性之一是“继承”。继承允许一个新类复用现有类的所有功能,并在无需修改原类代码的前提下对其进行扩展。

通过继承生成的新类被称为“子类”或“派生类”,而被继承的类则称为“基类”、“父类”或“超类”。继承本质上是将从一般概念推导至特殊概念的过程。部分OOP语言支持一个子类继承多个基类,但在Python等大多数语言中,子类通常仅能有一个直接基类;若需实现多重继承,可通过多级继承链或混合继承方式达成。

继承的实现方式主要包含两类:实现继承与接口继承。

实现继承指子类直接获得基类的属性和方法,无需额外编码即可使用。接口继承则仅要求子类使用基类属性和方法的名称,但子类必须提供具体的实现逻辑(即对父类方法进行重构)。

在设计继承关系时,需确保两个类之间具备“属于”关系。例如,Employee(员工)和Manager(经理)都属于Person(人),因此它们可以继承Person类。反之,Leg(腿)类不能继承Person类,因为腿并不属于人这一实体概念。

面向对象开发的典型流程为:划分对象 → 抽象类 → 构建层次化结构(通过继承和组合) → 利用类与实例进行设计与实现。

二、类的继承

2.1 继承的定义


class Person(object):   # 定义一个父类
 
    def talk(self):    # 父类中的方法
        print("person is talking....")  
 
 
class Chinese(Person):    # 定义一个子类, 继承Person类
 
    def walk(self):      # 在子类中定义其自身的方法
        print('is walking...')
 
c = Chinese()
c.talk()      # 调用继承的Person类的方法
c.walk()     # 调用本身的方法
 
# 输出
 
person is talking....
is walking...

2.2 构造函数的继承

若需为实例c传递参数,则必须使用构造函数。此时需明确构造函数如何继承,以及子类如何定义自身属性。

继承类的构造方法主要有两种写法:

1. 经典类的写法:父类名称.__init__(self, 参数1, 参数2, ...)。

2. 新式类的写法:super(子类, self).__init__(参数1, 参数2, ...)。


class Person(object):
 
    def __init__(self, name, age):
        self.name = name
        self.age = age
        self.weight = 'weight'
 
    def talk(self):
        print("person is talking....")
 
 
class Chinese(Person):
 
    def __init__(self, name, age, language):  # 先继承,在重构
        Person.__init__(self, name, age)  #继承父类的构造方法,也可以写成:super(Chinese,self).__init__(name,age)
        self.language = language    # 定义类的本身属性
 
    def walk(self):
        print('is walking...')
 
 
class American(Person):
    pass
 
c = Chinese('bigberg', 22, 'Chinese')

若仅在子类Chinese中简单定义构造函数,实则是在重构父类方法,这将导致子类无法继承父类的属性。因此,定义子类构造函数时,必须先调用父类构造函数进行继承,再定义子类特有属性,从而确保能获取父类属性。

子类构造函数继承父类构造函数的执行流程如下:

实例化对象c → c调用子类__init__() → 子类__init__()继承父类__init__() → 调用父类__init__()。

2.3 子类对父类方法的重写

若需修改基类/父类的方法,可在子类中重构该方法。以下示例展示了talk()方法的重写过程。


class Person(object):
 
    def __init__(self, name, age):
        self.name = name
        self.age = age
        self.weight = 'weight'
 
    def talk(self):
        print("person is talking....")
 
class Chinese(Person):
 
    def __init__(self, name, age, language): 
        Person.__init__(self, name, age) 
        self.language = language
        print(self.name, self.age, self.weight, self.language)
 
    def talk(self):  # 子类 重构方法
        print('%s is speaking chinese' % self.name)
 
    def walk(self):
        print('is walking...')
 
c = Chinese('bigberg', 22, 'Chinese')
c.talk()
 
# 输出
bigberg 22 weight Chinese
bigberg is speaking chinese

三、类继承的事例


class SchoolMember(object):
    '''学习成员基类'''
    member = 0
 
    def __init__(self, name, age, sex):
        self.name = name
        self.age = age
        self.sex = sex
        self.enroll()
 
    def enroll(self):
        '注册'
        print('just enrolled a new school member [%s].' % self.name)
        SchoolMember.member += 1
 
    def tell(self):
        print('----%s----' % self.name)
        for k, v in self.__dict__.items():
            print(k, v)
        print('----end-----')
 
    def __del__(self):
        print('开除了[%s]' % self.name)
        SchoolMember.member -= 1
 
 
class Teacher(SchoolMember):
    '教师'
    def __init__(self, name, age, sex, salary, course):
        SchoolMember.__init__(self, name, age, sex)
        self.salary = salary
        self.course = course
 
    def teaching(self):
        print('Teacher [%s] is teaching [%s]' % (self.name, self.course))
 
 
class Student(SchoolMember):
    '学生'
 
    def __init__(self, name, age, sex, course, tuition):
        SchoolMember.__init__(self, name, age, sex)
        self.course = course
        self.tuition = tuition
        self.amount = 0
 
    def pay_tuition(self, amount):
        print('student [%s] has just paied [%s]' % (self.name, amount))
        self.amount += amount
 
t1 = Teacher('Wusir', 28, 'M', 3000, 'python')
t1.tell()
s1 = Student('haitao', 38, 'M', 'python', 30000)
s1.tell()
s2 = Student('lichuang', 12, 'M', 'python', 11000)
print(SchoolMember.member)
del s2
 
print(SchoolMember.member)
 
 
 
# 输出
----end-----
just enrolled a new school member [haitao].
----haitao----
age 38
sex M
name haitao
amount 0
course python
tuition 30000
----end-----
just enrolled a new school member [lichuang].
3
开除了[lichuang]
2
开除了[Wusir]
开除了[haitao]

到此这篇关于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 算法库。