热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Python面向对象编程之继承详解

本文深入探讨了Python中面向对象编程的继承机制,详细介绍了继承的概念、实现方式及具体应用,通过实例代码帮助读者更好地理解和掌握这一重要特性。

一、引言

面向对象编程(Object-Oriented Programming,简称 OOP)是现代软件开发中的一种重要范式。继承是 OOP 的核心特性之一,它允许一个类(子类)继承另一个类(父类)的属性和方法,从而实现代码的复用和扩展。

通过继承,我们可以创建新的类,这些新类不仅具备父类的所有功能,还可以根据需要添加新的属性和方法,或者对父类的方法进行重写。

在 Python 中,继承的实现非常灵活,支持单继承和多继承。本文将详细介绍 Python 中继承的基本概念、实现方式以及具体应用。

二、继承的基本概念

2.1 继承的定义

继承是指一个类(子类)可以继承另一个类(父类)的属性和方法。子类不仅可以使用父类的属性和方法,还可以添加新的属性和方法,或者对父类的方法进行重写。

在 Python 中,子类通过在类定义时指定父类来实现继承。例如:

class Person:
    def talk(self):
        print("Person is talking...")

累
class Chinese(Person):
    def walk(self):
        print("Is walking...")

c = Chinese()
c.talk()  # 调用继承的父类方法
c.walk()  # 调用子类方法

# 输出结果
# Person is talking...
# Is walking...

2.2 构造函数的继承

在子类中,我们通常需要调用父类的构造函数来初始化父类的属性。Python 提供了两种方式来调用父类的构造函数:

  1. 使用父类名称直接调用:父类名称.__init__(self, 参数1, 参数2, ...)
  2. 使用 super() 函数:super(子类, self).__init__(参数1, 参数2, ...)

例如:

class Person:
    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)  # 使用 super 调用
        self.language = language

    def walk(self):
        print("Is walking...")

累
c = Chinese('Bigberg', 22, 'Chinese')

通过上述方式,子类可以继承父类的属性,并在此基础上添加自己的属性。

2.3 方法的重写

如果子类需要对父类的方法进行修改,可以在子类中重写该方法。例如:

class Person:
    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

    def talk(self):
        print(f'{self.name} is speaking {self.language}')

    def walk(self):
        print("Is walking...")

累
c = Chinese('Bigberg', 22, 'Chinese')
c.talk()

# 输出结果
# Bigberg is speaking Chinese

通过重写,子类可以根据自己的需求修改父类的方法行为。

三、继承的应用示例

为了更好地理解继承的实际应用,下面通过一个具体的例子来说明。假设我们有一个学校管理系统,其中包含教师和学生两类成员。我们可以定义一个基类 SchoolMember,然后分别定义 TeacherStudent 两个子类。

class SchoolMember:
    '''学校成员基类'''
    member_count = 0

    def __init__(self, name, age, sex):
        self.name = name
        self.age = age
        self.sex = sex
        self.enroll()

    def enroll(self):
        '''注册'''
        print(f'Just enrolled a new school member [{self.name}].')
        SchoolMember.member_count += 1

    def tell(self):
        print(f'----{self.name}----')
        for k, v in self.__dict__.items():
            print(f'{k}: {v}')
        print('----end-----')

    def __del__(self):
        print(f'Dismissed [{self.name}]')
        SchoolMember.member_count -= 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 teach(self):
        print(f'Teacher [{self.name}] is teaching [{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_paid = 0

    def pay_tuition(self, amount):
        print(f'Student [{self.name}] has just paid [{amount}]')
        self.amount_paid += 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(f'Total members: {SchoolMember.member_count}')
del s2
print(f'Total members: {SchoolMember.member_count}')

# 输出结果
# ----Wusir----
# age: 28
# sex: M
# name: Wusir
# salary: 3000
# course: Python
# ----end-----
# Just enrolled a new school member [Haitao].
# ----Haitao----
# age: 38
# sex: M
# name: Haitao
# amount_paid: 0
# course: Python
# tuition: 30000
# ----end-----
# Just enrolled a new school member [Lichuang].
# Total members: 3
# Dismissed [Lichuang]
# Total members: 2
# Dismissed [Wusir]
# Dismissed [Haitao]

推荐阅读
  • 本文将介绍如何编写一些有趣的VBScript脚本,这些脚本可以在朋友之间进行无害的恶作剧。通过简单的代码示例,帮助您了解VBScript的基本语法和功能。 ... [详细]
  • Python 异步编程:深入理解 asyncio 库(上)
    本文介绍了 Python 3.4 版本引入的标准库 asyncio,该库为异步 IO 提供了强大的支持。我们将探讨为什么需要 asyncio,以及它如何简化并发编程的复杂性,并详细介绍其核心概念和使用方法。 ... [详细]
  • 本文详细介绍如何使用Python进行配置文件的读写操作,涵盖常见的配置文件格式(如INI、JSON、TOML和YAML),并提供具体的代码示例。 ... [详细]
  • 技术分享:从动态网站提取站点密钥的解决方案
    本文探讨了如何从动态网站中提取站点密钥,特别是针对验证码(reCAPTCHA)的处理方法。通过结合Selenium和requests库,提供了详细的代码示例和优化建议。 ... [详细]
  • python的交互模式怎么输出名文汉字[python常见问题]
    在命令行模式下敲命令python,就看到类似如下的一堆文本输出,然后就进入到Python交互模式,它的提示符是>>>,此时我们可以使用print() ... [详细]
  • 本文详细探讨了Java中的24种设计模式及其应用,并介绍了七大面向对象设计原则。通过创建型、结构型和行为型模式的分类,帮助开发者更好地理解和应用这些模式,提升代码质量和可维护性。 ... [详细]
  • 1.如何在运行状态查看源代码?查看函数的源代码,我们通常会使用IDE来完成。比如在PyCharm中,你可以Ctrl+鼠标点击进入函数的源代码。那如果没有IDE呢?当我们想使用一个函 ... [详细]
  • 本文详细介绍了Java中org.eclipse.ui.forms.widgets.ExpandableComposite类的addExpansionListener()方法,并提供了多个实际代码示例,帮助开发者更好地理解和使用该方法。这些示例来源于多个知名开源项目,具有很高的参考价值。 ... [详细]
  • 在前两篇文章中,我们探讨了 ControllerDescriptor 和 ActionDescriptor 这两个描述对象,分别对应控制器和操作方法。本文将基于 MVC3 源码进一步分析 ParameterDescriptor,即用于描述 Action 方法参数的对象,并详细介绍其工作原理。 ... [详细]
  • 本文详细介绍了Akka中的BackoffSupervisor机制,探讨其在处理持久化失败和Actor重启时的应用。通过具体示例,展示了如何配置和使用BackoffSupervisor以实现更细粒度的异常处理。 ... [详细]
  • 本文详细介绍了Java编程语言中的核心概念和常见面试问题,包括集合类、数据结构、线程处理、Java虚拟机(JVM)、HTTP协议以及Git操作等方面的内容。通过深入分析每个主题,帮助读者更好地理解Java的关键特性和最佳实践。 ... [详细]
  • DNN Community 和 Professional 版本的主要差异
    本文详细解析了 DotNetNuke (DNN) 的两种主要版本:Community 和 Professional。通过对比两者的功能和附加组件,帮助用户选择最适合其需求的版本。 ... [详细]
  • Python自动化处理:从Word文档提取内容并生成带水印的PDF
    本文介绍如何利用Python实现从特定网站下载Word文档,去除水印并添加自定义水印,最终将文档转换为PDF格式。该方法适用于批量处理和自动化需求。 ... [详细]
  • 深入理解 SQL 视图、存储过程与事务
    本文详细介绍了SQL中的视图、存储过程和事务的概念及应用。视图为用户提供了一种灵活的数据查询方式,存储过程则封装了复杂的SQL逻辑,而事务确保了数据库操作的完整性和一致性。 ... [详细]
  • 尽管某些细分市场如WAN优化表现不佳,但全球运营商路由器和交换机市场持续增长。根据最新研究,该市场预计在2023年达到202亿美元的规模。 ... [详细]
author-avatar
LF猫咪
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有