第九章 · 面向对象编程
类与对象 · 模拟现实
面向对象编程用代码模拟现实事物,让程序组织更清晰。
类 (Class) 与实例 (Object)
class Student:
""" 学生类 """
def __init__(self, name, age):
self.name = name
self.age = age
def introduce(self):
return f"大家好,我叫{self.name},我{self.age}岁了"
# 实例化
xiaoming = Student("小明", 18)
print(xiaoming.introduce())
关键点:
__init__ 是构造方法,self 代表实例自身。类相当于模板,对象是具体的"人"。
使用类的对象-修改属性 & 对象容器
修改属性
可以直接通过 对象.属性 = 新值 修改,或定义方法更新。
class StudentGrade:
def __init__(self, name, yuwen, shuxue):
self.name = name
self.yuwen = yuwen
self.shuxue = shuxue
def update(self, course, grade):
if course == "语文":
self.yuwen = grade
elif course == "数学":
self.shuxue = grade
xiaoming = StudentGrade("小明", 88, 99)
# 直接修改
xiaoming.yuwen = 89
xiaoming.shuxue = 96
# 通过方法修改
xiaoming.update("语文", 88)
xiaoming.update("数学", 96)
类的对象放入列表和字典
# 列表存储
student_list = [xiaoming, xiaozhang, xiaozhao]
for student in student_list:
print(student.name, student.yuwen, student.shuxue)
# 字典存储 (键为姓名)
student_dict = {
"小明": xiaoming,
"小张": xiaozhang,
"小赵": xiaozhao,
}
for name, student in student_dict.items():
print(f"{name} 语文{student.yuwen} 数学{student.shuxue}")
容器优势: 列表便于遍历,字典便于按名字快速查找。
类练习题 · 婚礼礼金程序
需求说明
朋友结婚,你帮忙收彩礼。记录姓名和礼金,计算统计信息。
- 新建类 Customer,属性 name 和 money
- 循环输入 "小明 1000",构造对象存入列表
- 输入 quit 退出,输出总人数、总金额、最大/最小/平均
实现代码 (婚礼礼金程序.py)
class Customer:
def __init__(self, name, money):
self.name = name
self.money = money
customers = []
while True:
info = input("请输入来人姓名和金额:")
if info == "quit":
break
name, money = info.split()
money = int(money)
customer = Customer(name, money)
customers.append(customer)
print("访客总人数:", len(customers))
moneys = [c.money for c in customers]
print("总金额:", sum(moneys))
print("最大金额:", max(moneys))
print("最小金额:", min(moneys))
print("平均金额:", sum(moneys) / len(moneys))
这个练习题完美融合了类、列表、循环和数据处理。
类的继承 · 复用与扩展
父类定义公共能力,子类继承并扩展特有行为。
父类 Car
型号 · 价格 · 信息展示
子类 OilCar
继承 + 油箱 · 加油
子类 ElectricCar
继承 + 电池 · 充电
super()
调用父类方法,避免重复
继承示例
class Car:
def __init__(self, model, price):
self.model = model
self.price = price
def info(self):
print(f"车型{self.model} 价格{self.price}万")
class OilCar(Car):
def __init__(self, model, price, box_size):
super().__init__(model, price)
self.box_size = box_size
def add_oil(self, money):
print(f"加{money}元汽油")
继承的好处: 减少重复代码,子类自动拥有父类所有属性和方法,并可覆盖或新增。
类与模块 · 文件组织
将类放在 .py 文件中,通过 import 复用。
# car.py
class Car: ...
# main.py
import car
my_car = car.Car("路虎", 80)
my_car.info()