作者:LF猫咪 | 来源:互联网 | 2024-11-15 13:10
目录
- 一、引言
- 二、继承的基本概念
- 2.1 继承的定义
- 2.2 构造函数的继承
- 2.3 方法的重写
- 三、继承的应用示例
一、引言
面向对象编程(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 提供了两种方式来调用父类的构造函数:
- 使用父类名称直接调用:
父类名称.__init__(self, 参数1, 参数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
,然后分别定义 Teacher
和 Student
两个子类。
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]