类与对象 | 自在学类与对象
面向对象编程是现代软件开发中最重要的编程范式之一,它提供了一种组织和管理代码的强大方式。
通过面向对象编程,我们可以创建出能够准确模拟现实世界事物的代码结构,让程序的逻辑更加清晰、可维护性更强。
在面向对象编程中,我们将相关的数据和操作这些数据的函数组织在一起,形成类的概念,然后基于这些类创建出具体的对象实例。

创建和使用类
让我们从一个具体的例子开始理解类的概念。假设我们要为一个在线教育平台开发学生管理系统,首先需要创建一个表示学生的类。
定义学生类
每个学生都有一些基本信息,比如姓名、学号、年级等,同时还能进行一些操作,比如选课、查看成绩等。我们可以将这些共同特征和行为抽象为一个Student类:
class Student:
"""表示在线教育平台中的学生"""
def __init__(self, name, student_id, grade):
"""初始化学生的基本信息"""
self.name = name
self.student_id = student_id
self.grade = grade
self.courses = [] # 存储学生选修的课程
def introduce(self):
"""学生自我介绍"""
print(f"大家好,我是{self.name},学号是{self.student_id},我在{self.grade}年级。")
def enroll_course(self, course_name):
"""选修课程"""
self.courses.append(course_name)
print(f"{self.name}成功选修了《{course_name}》课程。")
在这个类定义中,我们可以看到几个重要的组成部分。类名Student使用了首字母大写的命名约定,这是Python中定义类的标准做法。
理解初始化方法
__init__方法是Python中的特殊方法,也被称为构造函数。当我们创建一个学生对象时,Python会自动调用这个方法来初始化对象的属性。方法名前后的双下划线是Python的约定,表示这是一个特殊方法,我们不应该直接调用它。
self参数在每个方法中都会出现,它代表类的实例本身。通过self,我们可以访问和修改实例的属性,也可以调用实例的其他方法。虽然我们在定义方法时必须包含self参数,但在调用方法时,Python会自动传递这个参数,我们不需要显式地提供它。
以self.为前缀的变量是实例属性,它们属于特定的对象实例。每个学生对象都有自己独立的姓名、学号和课程列表,这些属性之间不会相互影响。
创建和操作学生对象
现在让我们创建一些学生对象,并观察它们如何工作:
# 创建学生对象
student1 = Student("张小明", "2024001", "大一")
student2 = Student("李小红", "2024002", "大二")
# 学生自我介绍
student1.introduce()
student2.introduce()
# 学生选课
student1.enroll_course("Python编程基础")
student1.enroll_course("数据结构")
student2.enroll_course("Web开发技术")
student2.enroll_course("数据库系统")
# 查看学生信息
这段代码的执行结果将显示:
大家好,我是张小明,学号是2024001,我在大一年级。
大家好,我是李小红,学号是2024002,我在大二年级。
张小明成功选修了《Python编程基础》课程。
张小明成功选修了《数据结构》课程。
李小红成功选修了《Web开发技术》课程。
李小红成功选修了《数据库系统》课程。
张小明选修的课程:['Python编程基础', '数据结构']
李小红选修的课程:['Web开发技术', '数据库系统']
访问对象属性
我们可以使用点号表示法来访问对象的属性。这种语法直观易懂,让我们能够轻松地获取或修改对象的状态:
# 访问学生基本信息
print(f"学生姓名:{student1.name}")
print(f"学生学号:{student1.student_id}")
print(f"年级:{student1.grade}")
# 修改学生信息
student1.grade = "大二"
print(f"{student1.name}现在是{student1.grade
调用对象方法
方法的调用同样使用点号表示法,这种一致的语法设计让Python代码具有很好的可读性。当我们调用student1.introduce()时,Python会找到Student类中的introduce方法并执行其中的代码,同时自动将student1对象作为self参数传递给方法。
学生卡生成器
类与实例的深入理解
理解类和实例之间的关系是掌握面向对象编程的关键。类就像是一个模板或蓝图,它定义了某一类事物应该具有的属性和行为,但它本身并不是具体的事物。
实例则是根据这个模板创建出来的具体对象,每个实例都有自己独立的属性值。
比如,想象“学生证”这个现实例子:学校会设计一份学生证的模板(这就像是类),上面规定了需要包含姓名、学号、照片等信息。
但每一位学生拿到的学生证(实例)上,填写的内容都是属于自己的,彼此不同。类规定了“应该有什么”,而实例则是“具体有什么”。
创建多个实例的意义
让我们通过创建一个完整的班级来进一步理解这个概念:
class Course:
"""表示一门课程"""
def __init__(self, course_name, instructor, capacity):
"""初始化课程信息"""
self.course_name = course_name
self.instructor = instructor
self.capacity = capacity
self.enrolled_students = []
def add_student(self, student):
"""向课程添加学生"""
if len(self.enrolled_students) <
使用类和实例
在实际应用中,我们经常需要修改对象的属性值,这可能因为对象所代表的现实事物发生了变化。
Python提供了多种方式来修改属性值,让我们能够灵活地管理对象的状态。
设计更完整的学生管理系统
让我们创建一个更加完善的学生类,包含更多实用的功能:
class Student:
"""增强版学生类"""
def __init__(self, name, student_id, major, entry_year=2024):
"""初始化学生信息"""
self.name = name
self.student_id = student_id
self.major = major
self.entry_year = entry_year
self.gpa = 0.0 # 平均绩点,初始为0
self.courses_taken = {} # 记录已修课程及成绩
属性的直接修改与方法修改
在上面的例子中,我们可以看到两种修改对象状态的方式。一种是直接访问属性进行修改,另一种是通过方法来修改。
直接修改属性虽然简单,但可能会导致数据不一致的问题。而通过方法修改则可以加入验证逻辑,确保数据的有效性。
# 直接修改属性(不推荐的做法)
student.gpa = 4.0 # 可能与实际成绩不符
# 通过方法修改(推荐的做法)
student.add_course_grade("操作系统", 95) # 会自动重新计算GPA
在设计类时,为某些属性设置合理的默认值是一个好习惯。这样可以简化对象的创建过程,同时确保对象在创建时就处于一个有效的状态。
在我们的学生类中,gpa初始化为0.0,status初始化为"在读",这些都是合理的默认值。
继承的概念与应用
继承是面向对象编程中的一个核心概念,它允许我们基于现有的类创建新的类。新类会自动获得原有类的所有属性和方法,
同时还可以添加自己特有的功能。这种机制大大提高了代码的重用性,也让我们能够构建出层次清晰的类体系。
假设我们有一个学生类,它有姓名、学号、专业等属性,以及选课、毕业等方法。
现在我们想要创建本科生和研究生两个子类,它们都继承自学生类,但又有各自的特点。我们可以使用继承来实现这一点:
理解继承的基本概念
当我们发现某些类之间存在是一种关系时,就可以考虑使用继承。比如,研究生是学生的一种,本科生也是学生的一种。它们都具有学生的基本特征,但又有各自的特殊性。
让我们设计一个继承体系来表示不同类型的学生:
class Student:
"""基础学生类"""
def __init__(self, name, student_id, major):
"""初始化学生基本信息"""
self.name = name
self.student_id = student_id
self.major = major
self.courses = []
self.credits = 0
def get_basic_info(self):
"""获取基本信息"""
return f
super()函数的使用
在继承关系中,super()函数是一个非常重要的工具。它允许子类调用父类的方法,这在初始化子类对象或扩展父类功能时特别有用。在上面的例子中,我们在子类的__init__方法中使用super().__init__()来调用父类的初始化方法,确保继承来的属性得到正确的初始化。
方法重写的艺术
子类可以重写父类的方法来提供特定的实现。在我们的例子中,check_graduation方法在不同的学生类中有不同的实现。
本科生需要满足学分、实践学时和毕业设计的要求,而研究生则需要满足学分、发表论文和学位论文的要求。通过方法重写,我们让每种学生类型都有适合自己的毕业条件检查逻辑。
为子类添加特有功能
除了继承父类的功能外,子类还可以添加自己特有的属性和方法。本科生类添加了宿舍号、实践学时等属性,以及处理实践活动和毕业设计的方法。
研究生类则添加了研究方向、导师等属性,以及处理论文发表和学位论文的方法。这种设计让每个类都专注于自己的特殊职责。
Python 继承与进化工厂
将类存储在模块中
随着项目规模的扩大,将所有类和函数都堆在一个文件里会让代码变得混乱且难以维护。为了解决这个问题,Python 提供了模块(module)和包(package)机制,允许我们将相关的类、函数和变量分门别类地存放在不同的文件中。
这样不仅有助于代码的复用和协作开发,也让项目结构更加清晰。
为什么要模块化?
- 可维护性提升:每个模块只关注自己的功能,修改和调试时不会影响到无关的部分。
- 便于协作:多人开发时可以分工合作,每人负责不同的模块,互不干扰。
- 代码复用:常用的类和函数可以被多个项目或模块导入和复用。
- 命名空间隔离:不同模块中的同名变量、类不会互相冲突。
模块化设计的原则
- 单一职责原则:每个模块只负责一个明确的功能领域。例如,学生相关的类放在一个模块,课程相关的类放在另一个模块。
- 低耦合高内聚:模块之间的依赖关系要尽量简单,模块内部的功能要紧密相关。
- 清晰的接口:模块应通过清晰的接口(如类和函数)向外暴露功能,内部实现细节应尽量隐藏。
学生管理系统的模块结构示例
假设我们要开发一个较为完整的学生管理系统,可以将项目结构设计为如下:
# student_models.py - 学生相关的类定义
"""
学生管理系统 - 学生模型模块
包含学生、课程等核心类的定义
"""
class Person:
"""人员基类"""
def __init__(self, name, id_number, email):
self.name = name
self.id_number = id_number
self.email = email
self.phone = ""
self.address = ""
def
创建管理模块
# student_management.py - 学生管理功能模块
"""
学生管理系统 - 管理功能模块
提供学生、课程、教师的管理功能
"""
from student_models import Student, Teacher, Course
class StudentManagementSystem:
"""学生管理系统主类"""
def __init__(self, school_name):
self.school_name = school_name
self.students = {} # 学号到学生对象的映射
self.teachers = {} # 教师号到教师对象的映射
self.courses = {}
导入和使用模块
当我们将类分离到不同的模块文件后,主程序如果要使用这些类和功能,就必须通过导入(import)语句将它们引入进来。Python的导入机制非常灵活,支持多种导入方式,适用于不同的场景和需求。下面详细介绍常见的几种导入方法及其适用场景:
-
导入整个模块
使用 import 模块名 的方式可以将整个模块导入进来。此时,访问模块中的类或函数时需要加上模块名前缀。例如:
import student_models
student = student_models.Student("张三", ...)
这种方式有助于避免命名冲突,适合模块较大或需要频繁切换不同模块下同名对象的场景。
-
导入模块中的特定类或函数
使用 from 模块名 import 类名/函数名 可以只导入需要的部分。这样在使用时可以直接写类名或函数名,无需模块前缀。例如:
from student_models import Student, Teacher
s = Student("李四", ...)
这种方式代码更简洁,适合只需用到模块中部分内容的情况。
-
为导入的模块或类起别名
使用 as 关键字可以为导入的模块或类指定一个简短的别名,便于书写和阅读。例如:
from student_management
通过合理选择导入方式,可以让你的代码结构更加清晰、易于维护,也有助于团队协作和代码复用。
# main.py - 主程序文件
"""
学生管理系统主程序
演示模块化设计的使用方式
"""
# 方式1:导入整个模块
import student_models
import student_management
# 方式2:导入特定的类
from student_models import Student, Teacher, Course
from student_management import StudentManagementSystem
# 方式3:使用别名导入
from student_management import StudentManagementSystem as SMS
def create_demo_system():
"""创建演示系统"""
# 使用导入的类创建系统
这种模块化的设计带来了许多好处。首先,代码的组织结构更加清晰,每个模块都有明确的职责。其次,不同模块可以独立开发和测试,提高了开发效率。最后,当需要修改某个功能时,我们只需要关注相关的模块,而不会影响到整个系统。
习题
9. 类定义和对象创建
完成以下类定义,创建一个Book类,包含构造方法和显示信息的方法。
class Book:
def __init__(self, title, author, price):
"""初始化图书信息"""
self.title = title
self.author = author
self.price = price
def display_info(self):
"""显示图书信息"""
print(f"《{self.title}》- {self.author} - ¥{self.price
10. 类的继承
完成继承相关代码,创建Animal基类和Dog、Cat子类。
class Animal:
def __init__(self, name):
self.name = name
def speak(self):
pass
class Dog(Animal):
def speak(self):
return f"{self.name}说:汪汪!"
class Cat(Animal):
def speak(self):
11. 简单的学生类
编写一个Student类,包含姓名、年龄、成绩等属性,以及显示信息和计算平均分的方法。
class Student:
def __init__(self, name, age):
"""初始化学生信息"""
self.name = name
self.age = age
self.scores = [] # 成绩列表
def add_score(self, score):
"""添加成绩"""
self.scores.append(score)
def calculate_average(self):
"""计算平均分"""
if len(self
print(f"{student1.name}选修的课程:{student1.courses}")
print(f"{student2.name}选修的课程:{student2.courses}")
}
的学生了。"
)
self
.capacity:
self.enrolled_students.append(student)
print(f"{student.name}成功选修《{self.course_name}》")
else:
print(f"《{self.course_name}》已满员,{student.name}选课失败")
def show_enrollment(self):
"""显示选课情况"""
print(f"《{self.course_name}》选课情况:")
print(f"授课教师:{self.instructor}")
print(f"容量:{self.capacity}人,已选:{len(self.enrolled_students)}人")
if self.enrolled_students:
print("已选学生:")
for student in self.enrolled_students:
print(f" - {student.name} ({student.student_id})")
# 创建课程实例
python_course = Course("Python编程基础", "王老师", 3)
# 创建多个学生实例
students = [
Student("张小明", "2024001", "大一"),
Student("李小红", "2024002", "大一"),
Student("王小华", "2024003", "大一"),
Student("赵小亮", "2024004", "大一")
]
# 学生选课过程
for student in students:
python_course.add_student(student)
# 查看最终选课结果
python_course.show_enrollment()
self.status = "在读" # 学生状态
def get_info(self):
"""获取学生完整信息"""
current_year = 2024
grade = current_year - self.entry_year + 1
info = f"{self.name}({self.student_id})\n"
info += f"专业:{self.major} 年级:{grade}年级\n"
info += f"GPA:{self.gpa:.2f} 状态:{self.status}"
return info
def add_course_grade(self, course_name, grade):
"""添加课程成绩"""
if 0 <= grade <= 100:
self.courses_taken[course_name] = grade
self._calculate_gpa()
print(f"已记录{self.name}的《{course_name}》成绩:{grade}分")
else:
print("成绩必须在0-100分之间")
def _calculate_gpa(self):
"""计算GPA(私有方法)"""
if self.courses_taken:
total_score = sum(self.courses_taken.values())
self.gpa = total_score / len(self.courses_taken) / 25 # 简化的GPA计算
def update_status(self, new_status):
"""更新学生状态"""
valid_statuses = ["在读", "休学", "毕业", "退学"]
if new_status in valid_statuses:
old_status = self.status
self.status = new_status
print(f"{self.name}的状态已从'{old_status}'更新为'{new_status}'")
else:
print(f"无效状态:{new_status}")
# 使用示例
student = Student("陈小华", "2024005", "计算机科学", 2022)
# 查看初始信息
print(student.get_info())
print()
# 添加课程成绩
student.add_course_grade("高等数学", 88)
student.add_course_grade("Python编程", 92)
student.add_course_grade("数据结构", 85)
print()
# 查看更新后的信息
print(student.get_info())
print()
# 更新学生状态
student.update_status("毕业")
"
{self
.name
}
(
{self
.student_id
}
),专业:
{self
.major
}
"
def add_course(self, course_name, credit):
"""添加课程"""
self.courses.append(course_name)
self.credits += credit
print(f"{self.name}选修了《{course_name}》,获得{credit}学分")
def check_graduation(self):
"""检查毕业条件(基础版)"""
return self.credits >= 120
class UndergraduateStudent(Student):
"""本科生类"""
def __init__(self, name, student_id, major, dormitory_number):
"""初始化本科生信息"""
super().__init__(name, student_id, major)
self.dormitory_number = dormitory_number
self.practical_hours = 0 # 实践学时
self.graduation_project = None # 毕业设计
def add_practical_hours(self, hours, activity):
"""添加实践学时"""
self.practical_hours += hours
print(f"{self.name}完成{activity},获得{hours}实践学时")
def set_graduation_project(self, project_title, advisor):
"""设置毕业设计"""
self.graduation_project = {
'title': project_title,
'advisor': advisor,
'status': '进行中'
}
print(f"{self.name}的毕业设计:《{project_title}》,指导老师:{advisor}")
def check_graduation(self):
"""检查本科生毕业条件"""
basic_requirement = super().check_graduation()
practical_requirement = self.practical_hours >= 200
project_requirement = (self.graduation_project is not None and
self.graduation_project['status'] == '已完成')
return basic_requirement and practical_requirement and project_requirement
class GraduateStudent(Student):
"""研究生类"""
def __init__(self, name, student_id, major, research_direction, advisor):
"""初始化研究生信息"""
super().__init__(name, student_id, major)
self.research_direction = research_direction
self.advisor = advisor
self.publications = [] # 发表论文
self.thesis_status = "准备中" # 学位论文状态
def add_publication(self, title, journal, year):
"""添加发表论文"""
publication = {
'title': title,
'journal': journal,
'year': year
}
self.publications.append(publication)
print(f"{self.name}发表论文:《{title}》于《{journal}》({year}年)")
def update_thesis_status(self, status):
"""更新论文状态"""
valid_statuses = ["准备中", "写作中", "审核中", "已答辩", "已通过"]
if status in valid_statuses:
self.thesis_status = status
print(f"{self.name}的学位论文状态更新为:{status}")
def check_graduation(self):
"""检查研究生毕业条件"""
basic_requirement = super().check_graduation()
publication_requirement = len(self.publications) >= 1
thesis_requirement = self.thesis_status == "已通过"
return basic_requirement and publication_requirement and thesis_requirement
# 创建不同类型的学生
undergraduate = UndergraduateStudent("张小明", "2024001", "计算机科学", "A301")
graduate = GraduateStudent("李小红", "2024101", "人工智能", "机器学习", "王教授")
# 本科生的学习生活
print("=== 本科生张小明的学习记录 ===")
undergraduate.add_course("高等数学", 4)
undergraduate.add_course("Python编程", 3)
undergraduate.add_practical_hours(40, "企业实习")
undergraduate.set_graduation_project("在线教育平台设计", "张教授")
print(f"\n基本信息:{undergraduate.get_basic_info()}")
print(f"宿舍号:{undergraduate.dormitory_number}")
print(f"实践学时:{undergraduate.practical_hours}")
# 研究生的学术生活
print("\n=== 研究生李小红的学术记录 ===")
graduate.add_course("高级算法", 3)
graduate.add_course("深度学习", 4)
graduate.add_publication("基于深度学习的图像识别研究", "计算机学报", 2024)
graduate.update_thesis_status("写作中")
print(f"\n基本信息:{graduate.get_basic_info()}")
print(f"研究方向:{graduate.research_direction}")
print(f"导师:{graduate.advisor}")
print(f"发表论文数:{len(graduate.publications)}")
update_contact
(self, phone
=
None
, address
=
None
):
"""更新联系方式"""
if phone:
self.phone = phone
if address:
self.address = address
print(f"已更新{self.name}的联系方式")
def get_contact_info(self):
"""获取联系信息"""
return {
'name': self.name,
'email': self.email,
'phone': self.phone,
'address': self.address
}
class Student(Person):
"""学生类"""
def __init__(self, name, student_id, email, major, enrollment_year):
super().__init__(name, student_id, email)
self.major = major
self.enrollment_year = enrollment_year
self.current_semester = 1
self.gpa = 0.0
self.course_records = []
def advance_semester(self):
"""进入下一学期"""
self.current_semester += 1
print(f"{self.name}进入第{self.current_semester}学期")
def add_course_record(self, course_name, grade, credits, semester):
"""添加课程记录"""
record = {
'course_name': course_name,
'grade': grade,
'credits': credits,
'semester': semester
}
self.course_records.append(record)
self._update_gpa()
def _update_gpa(self):
"""更新GPA"""
if not self.course_records:
return
total_points = 0
total_credits = 0
for record in self.course_records:
# 简化的GPA计算:90-100=4.0, 80-89=3.0, 70-79=2.0, 60-69=1.0, <60=0
if record['grade'] >= 90:
points = 4.0
elif record['grade'] >= 80:
points = 3.0
elif record['grade'] >= 70:
points = 2.0
elif record['grade'] >= 60:
points = 1.0
else:
points = 0.0
total_points += points * record['credits']
total_credits += record['credits']
self.gpa = round(total_points / total_credits, 2) if total_credits > 0 else 0.0
class Teacher(Person):
"""教师类"""
def __init__(self, name, teacher_id, email, department, title):
super().__init__(name, teacher_id, email)
self.department = department
self.title = title # 职称:助教、讲师、副教授、教授
self.courses_taught = []
self.office_hours = {}
def assign_course(self, course):
"""分配课程"""
if course not in self.courses_taught:
self.courses_taught.append(course)
course.instructor = self
print(f"{self.name}老师被分配教授《{course.course_name}》")
def set_office_hours(self, day, time_slot):
"""设置答疑时间"""
self.office_hours[day] = time_slot
print(f"{self.name}老师设置{day}的答疑时间为{time_slot}")
class Course:
"""课程类"""
def __init__(self, course_code, course_name, credits, department):
self.course_code = course_code
self.course_name = course_name
self.credits = credits
self.department = department
self.instructor = None
self.enrolled_students = []
self.prerequisites = [] # 先修课程
self.max_capacity = 50
def set_prerequisites(self, prerequisite_courses):
"""设置先修课程"""
self.prerequisites = prerequisite_courses
course_names = [course.course_name for course in prerequisite_courses]
print(f"《{self.course_name}》的先修课程:{', '.join(course_names)}")
def check_prerequisites(self, student):
"""检查学生是否满足先修要求"""
if not self.prerequisites:
return True
completed_courses = [record['course_name'] for record in student.course_records]
required_courses = [course.course_name for course in self.prerequisites]
for required in required_courses:
if required not in completed_courses:
return False
return True
def enroll_student(self, student):
"""学生选课"""
if len(self.enrolled_students) >= self.max_capacity:
print(f"《{self.course_name}》已满员")
return False
if student in self.enrolled_students:
print(f"{student.name}已经选修了《{self.course_name}》")
return False
if not self.check_prerequisites(student):
print(f"{student.name}不满足《{self.course_name}》的先修要求")
return False
self.enrolled_students.append(student)
print(f"{student.name}成功选修《{self.course_name}》")
return True
# 课程代码到课程对象的映射
self.current_semester = "2024春季"
def register_student(self, name, student_id, email, major, enrollment_year):
"""注册新学生"""
if student_id in self.students:
print(f"学号{student_id}已存在")
return None
student = Student(name, student_id, email, major, enrollment_year)
self.students[student_id] = student
print(f"学生{name}注册成功,学号:{student_id}")
return student
def register_teacher(self, name, teacher_id, email, department, title):
"""注册新教师"""
if teacher_id in self.teachers:
print(f"教师号{teacher_id}已存在")
return None
teacher = Teacher(name, teacher_id, email, department, title)
self.teachers[teacher_id] = teacher
print(f"教师{name}注册成功,教师号:{teacher_id}")
return teacher
def add_course(self, course_code, course_name, credits, department):
"""添加新课程"""
if course_code in self.courses:
print(f"课程代码{course_code}已存在")
return None
course = Course(course_code, course_name, credits, department)
self.courses[course_code] = course
print(f"课程《{course_name}》添加成功,课程代码:{course_code}")
return course
def assign_instructor(self, course_code, teacher_id):
"""为课程分配教师"""
if course_code not in self.courses:
print(f"课程{course_code}不存在")
return False
if teacher_id not in self.teachers:
print(f"教师{teacher_id}不存在")
return False
course = self.courses[course_code]
teacher = self.teachers[teacher_id]
teacher.assign_course(course)
return True
def student_select_course(self, student_id, course_code):
"""学生选课"""
if student_id not in self.students:
print(f"学号{student_id}不存在")
return False
if course_code not in self.courses:
print(f"课程{course_code}不存在")
return False
student = self.students[student_id]
course = self.courses[course_code]
return course.enroll_student(student)
def record_grade(self, student_id, course_code, grade):
"""记录学生成绩"""
if student_id not in self.students:
print(f"学号{student_id}不存在")
return False
if course_code not in self.courses:
print(f"课程{course_code}不存在")
return False
student = self.students[student_id]
course = self.courses[course_code]
if student not in course.enrolled_students:
print(f"{student.name}未选修《{course.course_name}》")
return False
student.add_course_record(
course.course_name,
grade,
course.credits,
self.current_semester
)
print(f"已记录{student.name}《{course.course_name}》成绩:{grade}分")
return True
def get_student_transcript(self, student_id):
"""获取学生成绩单"""
if student_id not in self.students:
print(f"学号{student_id}不存在")
return None
student = self.students[student_id]
print(f"\n{self.school_name} - 学生成绩单")
print("="*50)
print(f"姓名:{student.name}")
print(f"学号:{student.student_id}")
print(f"专业:{student.major}")
print(f"入学年份:{student.enrollment_year}")
print(f"当前GPA:{student.gpa}")
print("\n课程成绩:")
if student.course_records:
total_credits = 0
for record in student.course_records:
print(f" {record['course_name']}: {record['grade']}分 "
f"({record['credits']}学分) - {record['semester']}")
total_credits += record['credits']
print(f"\n总学分:{total_credits}")
else:
print(" 暂无课程记录")
def get_course_enrollment(self, course_code):
"""获取课程选课情况"""
if course_code not in self.courses:
print(f"课程{course_code}不存在")
return None
course = self.courses[course_code]
print(f"\n《{course.course_name}》选课情况")
print("="*40)
print(f"课程代码:{course.course_code}")
print(f"学分:{course.credits}")
print(f"开课部门:{course.department}")
if course.instructor:
print(f"授课教师:{course.instructor.name} ({course.instructor.title})")
else:
print("授课教师:未分配")
print(f"选课人数:{len(course.enrolled_students)}/{course.max_capacity}")
if course.enrolled_students:
print("\n选课学生:")
for student in course.enrolled_students:
print(f" {student.name} ({student.id_number}) - {student.major}")
# 使用示例
def demo_student_management_system():
"""演示学生管理系统的使用"""
# 创建管理系统
sms = StudentManagementSystem("Python大学")
print("=== 初始化系统数据 ===")
# 注册学生
sms.register_student("张小明", "2024001", "zhangxm@py.edu", "计算机科学", 2024)
sms.register_student("李小红", "2024002", "lixh@py.edu", "软件工程", 2024)
sms.register_student("王小华", "2024003", "wangxh@py.edu", "人工智能", 2024)
# 注册教师
sms.register_teacher("张教授", "T001", "zhang@py.edu", "计算机学院", "教授")
sms.register_teacher("李老师", "T002", "li@py.edu", "计算机学院", "副教授")
# 添加课程
sms.add_course("CS101", "计算机科学导论", 3, "计算机学院")
sms.add_course("CS102", "Python编程基础", 4, "计算机学院")
sms.add_course("CS201", "数据结构与算法", 4, "计算机学院")
# 分配教师
sms.assign_instructor("CS101", "T001")
sms.assign_instructor("CS102", "T002")
sms.assign_instructor("CS201", "T001")
# 设置先修课程
python_course = sms.courses["CS102"]
data_structure_course = sms.courses["CS201"]
data_structure_course.set_prerequisites([python_course])
print("\n=== 学生选课阶段 ===")
# 学生选课
sms.student_select_course("2024001", "CS101")
sms.student_select_course("2024001", "CS102")
sms.student_select_course("2024002", "CS101")
sms.student_select_course("2024002", "CS102")
sms.student_select_course("2024003", "CS201") # 应该失败,因为没有先修课程
print("\n=== 记录成绩阶段 ===")
# 记录成绩
sms.record_grade("2024001", "CS101", 92)
sms.record_grade("2024001", "CS102", 88)
sms.record_grade("2024002", "CS101", 85)
sms.record_grade("2024002", "CS102", 90)
print("\n=== 查询统计阶段 ===")
# 查看学生成绩单
sms.get_student_transcript("2024001")
# 查看课程选课情况
sms.get_course_enrollment("CS102")
if __name__ == "__main__":
demo_student_management_system()
import
StudentManagementSystem
as
SMS
system = SMS("自由大学")
导入所有内容(不推荐)
还可以用 from 模块名 import * 导入模块中所有公开对象,但这种方式容易造成命名空间污染和冲突,一般不推荐在实际项目中使用。
system = SMS("示例大学")
# 创建一些基础数据
students_data = [
("张三", "2024001", "zhangsan@example.com", "计算机科学", 2024),
("李四", "2024002", "lisi@example.com", "软件工程", 2024),
("王五", "2024003", "wangwu@example.com", "数据科学", 2024)
]
for name, sid, email, major, year in students_data:
system.register_student(name, sid, email, major, year)
# 创建课程体系
courses_data = [
("MATH101", "高等数学A", 4, "数学学院"),
("CS101", "程序设计基础", 4, "计算机学院"),
("CS102", "面向对象编程", 3, "计算机学院"),
("CS201", "数据结构", 4, "计算机学院")
]
for code, name, credits, dept in courses_data:
system.add_course(code, name, credits, dept)
return system
def simulate_semester(system):
"""模拟一个学期的教学过程"""
print("=== 第一学期开始 ===")
# 学生选课
selections = [
("2024001", "MATH101"),
("2024001", "CS101"),
("2024002", "MATH101"),
("2024002", "CS101"),
("2024003", "CS101")
]
for student_id, course_code in selections:
system.student_select_course(student_id, course_code)
# 期末成绩录入
grades = [
("2024001", "MATH101", 88),
("2024001", "CS101", 92),
("2024002", "MATH101", 85),
("2024002", "CS101", 90),
("2024003", "CS101", 87)
]
print("\n=== 期末成绩录入 ===")
for student_id, course_code, grade in grades:
system.record_grade(student_id, course_code, grade)
# 查看统计信息
print("\n=== 学期总结 ===")
for student_id in ["2024001", "2024002", "2024003"]:
system.get_student_transcript(student_id)
print()
if __name__ == "__main__":
demo_system = create_demo_system()
simulate_semester(demo_system)
}
"
)
# 创建图书对象
book = Book("Python编程", "张三", 59.9)
book.display_info()
__init__是构造方法,在创建对象时自动调用
self代表对象实例本身,用于访问对象的属性
self.title = title将参数值赋给对象的属性
display_info(self)是实例方法,第一个参数必须是self
Book("Python编程", "张三", 59.9)创建Book类的实例
return f"{self.name}说:喵喵!"
# 创建对象
dog = Dog("旺财")
print(dog.speak())
cat = Cat("小花")
print(cat.speak())
class Dog(Animal):表示Dog类继承自Animal类
- 子类可以重写父类的方法,Dog和Cat都重写了speak()方法
- 子类自动继承父类的属性和方法,Dog和Cat都有name属性
- 每个子类可以有自己的实现方式
.scores)
==
0
:
return 0
return sum(self.scores) / len(self.scores)
def display_info(self):
"""显示学生信息"""
print(f"姓名:{self.name}")
print(f"年龄:{self.age}")
if self.scores:
print(f"成绩:{self.scores}")
print(f"平均分:{self.calculate_average():.2f}")
else:
print("暂无成绩")
# 创建学生对象
student = Student("小明", 18)
student.add_score(85)
student.add_score(92)
student.add_score(78)
student.display_info()
姓名:小明
年龄:18
成绩:[85, 92, 78]
平均分:85.00
__init__方法初始化学生的基本信息和空成绩列表
add_score方法向成绩列表添加分数
calculate_average方法计算平均分,处理空列表的情况
display_info方法显示学生的完整信息