热门标签 | 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]

推荐阅读
  • Python 中使用 Pyecharts 绘制雷达图详解
    本文将详细介绍如何在 Python 环境中利用 Pyecharts 库来创建美观且功能丰富的雷达图。适合需要图形化展示多维度数据的开发者和研究人员。 ... [详细]
  • Python | Pandas series . as _ matrix() ... [详细]
  • sqlserver动态分区方案例子
    sqlserver动态分区方案例子当我们存储的数据量比较大时,比如超过千万,上亿级别时单纯的使用索引可能效果不明显了,此时我们可以考虑采 ... [详细]
  • 本文介绍了如何计算给定数组中所有非质数元素的总和,并提供了多种编程语言的实现示例。 ... [详细]
  • 详解 | 日志系统ViseLog的基本使用与功能
    本文详细介绍了日志系统ViseLog的使用方法及其核心功能,旨在帮助开发者更好地理解和利用这一工具,提高开发效率。 ... [详细]
  • Python基础教程:struct模块与格式化字符详解
    本文详细介绍了Python中struct模块的功能,以及如何利用格式化字符实现Python与C语言结构体之间的数据转换。文章通过具体实例讲解了struct模块的主要方法及其应用场景。 ... [详细]
  • 本文深入探讨网页游戏的开发流程,涵盖从程序框架设计到具体实现的技术细节,旨在为开发者提供全面的指导。 ... [详细]
  • C语言入门精选教程与书籍推荐
    本文精选了几本适合不同水平学习者的C语言书籍,从基础入门到进阶提高,帮助读者全面掌握C语言的核心知识和技术。 ... [详细]
  • 并发环境下的集合元素移除技巧与注意事项
    探讨在并发编程中对集合进行元素移除操作时应注意的关键点,包括使用迭代器的安全方法以及避免常见错误。 ... [详细]
  • 本文探讨了在JavaScript中执行字符串形式代码的多种方法,包括使用eval()函数以及跨页面调用的方法。同时,文章详细介绍了JavaScript中字符串的各种常用方法及其应用场景。 ... [详细]
  • 本文将详细介绍NSRunLoop的工作原理,包括其基本概念、消息类型(事件源)、运行模式、生命周期管理以及嵌套运行等关键知识点,帮助开发者更好地理解和应用这一重要技术。 ... [详细]
  • 本文介绍如何在Django项目中利用UpdateView更新数据后,根据主键(pk)自动重定向至对应的DetailView页面,实现流畅的用户交互体验。 ... [详细]
  • 本文详细介绍了如何使用 PHP 编程语言输出 99 乘法表,包括使用不同的循环结构如 do-while、for 循环等方法,并提供了具体的代码示例。 ... [详细]
  • 利用RabbitMQ实现高效延迟任务处理
    本文详细探讨了如何利用RabbitMQ实现延迟任务,包括其应用场景、实现原理、系统设计以及具体的Spring Boot实现方式。 ... [详细]
  • ServletContext接口在Java Web开发中扮演着重要角色,它提供了一种方式来获取关于整个Web应用程序的信息。通过ServletContext,开发者可以访问初始化参数、共享数据以及应用资源。 ... [详细]
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社区 版权所有