阶段二:进阶者 (Level 11-20)
目标:理解面向对象,掌握常用模块
任务清单:
- 面向对象:
类、对象
# 现实世界:狗
# 属性:名字、品种、年龄
# 行为:叫、跑、吃
# 在Python中定义类
class Dog:
# 构造函数:创建对象时自动调用
def __init__(self, name, breed, age):
# 属性(实例变量)
self.name = name
self.breed = breed
self.age = age
# 方法(行为)
def bark(self):
print(f"{self.name} 在汪汪叫!")
def run(self):
print(f"{self.name} 在奔跑...")
def eat(self, food):
print(f"{self.name} 正在吃 {food}")
# 创建对象(实例化)
my_dog = Dog("旺财", "金毛", 3)
friend_dog = Dog("小黑", "拉布拉多", 2)
# 使用对象
print(f"我的狗叫 {my_dog.name},是 {my_dog.breed},{my_dog.age} 岁")
my_dog.bark()
my_dog.eat("狗粮")
print(f"朋友的狗叫 {friend_dog.name}")
friend_dog.run()class Student:
def __init__(self, name, student_id, grade):
self.name = name
self.student_id = student_id
self.grade = grade
self.scores = {} # 字典存储成绩
def add_score(self, subject, score):
"""添加科目成绩"""
self.scores[subject] = score
print(f"为 {self.name} 添加了 {subject} 成绩: {score}")
def get_average_score(self):
"""计算平均分"""
if not self.scores:
return 0
return sum(self.scores.values()) / len(self.scores)
def display_info(self):
"""显示学生信息"""
print(f"学生: {self.name} (学号: {self.student_id})")
print(f"班级: {self.grade}")
if self.scores:
print("成绩:")
for subject, score in self.scores.items():
print(f" {subject}: {score}")
print(f"平均分: {self.get_average_score():.2f}")
else:
print("暂无成绩")
print("-" * 30)
# 测试学生类
student1 = Student("小明", "2024001", "高三(1)班")
student2 = Student("小红", "2024002", "高三(1)班")
student1.add_score("数学", 95)
student1.add_score("英语", 88)
student2.add_score("数学", 92)
student2.add_score("英语", 90)
student1.display_info()
student2.display_info()继承
# 父类(基类)
class Animal:
def __init__(self, name, age):
self.name = name
self.age = age
def eat(self):
print(f"{self.name} 在吃东西")
def sleep(self):
print(f"{self.name} 在睡觉")
def make_sound(self):
print(f"{self.name} 发出声音")
# 子类(派生类)
class Dog(Animal): # 继承Animal类
def __init__(self, name, age, breed):
super().__init__(name, age) # 调用父类的构造函数
self.breed = breed
# 重写父类方法
def make_sound(self):
print(f"{self.name} 在汪汪叫!")
# 子类特有的方法
def fetch(self):
print(f"{self.name} 在接飞盘")
class Cat(Animal):
def __init__(self, name, age, color):
super().__init__(name, age)
self.color = color
def make_sound(self):
print(f"{self.name} 在喵喵叫!")
def climb_tree(self):
print(f"{self.name} 在爬树")
# 测试继承
dog = Dog("旺财", 3, "金毛")
cat = Cat("咪咪", 2, "白色")
print(f"{dog.name} 是 {dog.breed}")
dog.eat()
dog.make_sound()
dog.fetch()
print(f"\n{cat.name} 是 {cat.color}的")
cat.sleep()
cat.make_sound()
cat.climb_tree()import math
class Shape:
"""图形基类"""
def __init__(self, name):
self.name = name
def area(self):
"""计算面积"""
raise NotImplementedError("子类必须实现这个方法")
def perimeter(self):
"""计算周长"""
raise NotImplementedError("子类必须实现这个方法")
def display_info(self):
print(f"图形: {self.name}")
print(f"面积: {self.area():.2f}")
print(f"周长: {self.perimeter():.2f}")
print("-" * 30)
class Rectangle(Shape):
"""矩形类"""
def __init__(self, width, height):
super().__init__("矩形")
self.width = width
self.height = height
def area(self):
return self.width * self.height
def perimeter(self):
return 2 * (self.width + self.height)
class Circle(Shape):
"""圆形类"""
def __init__(self, radius):
super().__init__("圆形")
self.radius = radius
def area(self):
return math.pi * self.radius ** 2
def perimeter(self):
return 2 * math.pi * self.radius
class Triangle(Shape):
"""三角形类"""
def __init__(self, a, b, c):
super().__init__("三角形")
self.a = a
self.b = b
self.c = c
def area(self):
# 使用海伦公式
s = self.perimeter() / 2
return math.sqrt(s * (s - self.a) * (s - self.b) * (s - self.c))
def perimeter(self):
return self.a + self.b + self.c
# 测试图形类
shapes = [
Rectangle(5, 3),
Circle(4),
Triangle(3, 4, 5)
]
for shape in shapes:
shape.display_info()封装
class BankAccount:
def __init__(self, account_holder, initial_balance=0):
self.account_holder = account_holder
self._balance = initial_balance # 保护属性
self._transaction_history = [] # 交易记录
# 使用@property装饰器提供受控访问
@property
def balance(self):
return self._balance
def deposit(self, amount):
"""存款"""
if amount <= 0:
print("存款金额必须大于0")
return False
self._balance += amount
self._transaction_history.append(f"存款: +{amount}元")
print(f"存款成功!当前余额: {self._balance}元")
return True
def withdraw(self, amount):
"""取款"""
if amount <= 0:
print("取款金额必须大于0")
return False
if amount > self._balance:
print("余额不足!")
return False
self._balance -= amount
self._transaction_history.append(f"取款: -{amount}元")
print(f"取款成功!当前余额: {self._balance}元")
return True
def get_transaction_history(self):
"""获取交易记录"""
return self._transaction_history.copy() # 返回副本保护原始数据
# 测试银行账户
account = BankAccount("张三", 1000)
print(f"账户持有人: {account.account_holder}")
account.deposit(500)
account.withdraw(200)
account.withdraw(2000) # 会失败
print("交易记录:", account.get_transaction_history())class Temperature:
def __init__(self, celsius=0):
self._celsius = celsius # 内部存储为摄氏度
@property
def celsius(self):
return self._celsius
@celsius.setter
def celsius(self, value):
if value < -273.15: # 绝对零度
raise ValueError("温度不能低于绝对零度(-273.15°C)")
self._celsius = value
@property
def fahrenheit(self):
return (self._celsius * 9/5) + 32
@fahrenheit.setter
def fahrenheit(self, value):
self.celsius = (value - 32) * 5/9
@property
def kelvin(self):
return self._celsius + 273.15
@kelvin.setter
def kelvin(self, value):
if value < 0:
raise ValueError("开尔文温度不能低于0")
self.celsius = value - 273.15
def display(self):
print(f"{self.celsius:.2f}°C = {self.fahrenheit:.2f}°F = {self.kelvin:.2f}K")
# 测试温度类
temp = Temperature(25)
temp.display()
print("\n设置华氏温度:")
temp.fahrenheit = 100
temp.display()
print("\n设置开尔文温度:")
temp.kelvin = 300
temp.display()多态和方法重写
class Employee:
"""员工基类"""
def __init__(self, name, salary):
self.name = name
self.salary = salary
def work(self):
print(f"{self.name} 在工作")
def calculate_bonus(self):
"""计算奖金 - 基类实现"""
return self.salary * 0.1
def get_info(self):
return f"员工: {self.name}, 月薪: {self.salary}, 奖金: {self.calculate_bonus()}"
class Manager(Employee):
"""经理类"""
def __init__(self, name, salary, team_size):
super().__init__(name, salary)
self.team_size = team_size
def work(self):
print(f"{self.name} 经理在管理团队")
def calculate_bonus(self):
"""重写奖金计算方法"""
return self.salary * 0.2 + self.team_size * 100
def get_info(self):
base_info = super().get_info()
return f"{base_info}, 团队规模: {self.team_size}人"
class Developer(Employee):
"""开发人员类"""
def __init__(self, name, salary, programming_language):
super().__init__(name, salary)
self.programming_language = programming_language
def work(self):
print(f"{self.name} 在用 {self.programming_language} 编程")
def calculate_bonus(self):
"""重写奖金计算方法"""
bonus = self.salary * 0.15
if self.programming_language in ["Python", "Java"]:
bonus += 500 # 热门语言额外奖金
return bonus
def get_info(self):
base_info = super().get_info()
return f"{base_info}, 编程语言: {self.programming_language}"
# 测试多态
employees = [
Manager("张总", 20000, 5),
Developer("小李", 15000, "Python"),
Developer("小王", 12000, "Java"),
Employee("普通员工", 8000)
]
print("=== 员工工作状态 ===")
for employee in employees:
employee.work()
print("\n=== 员工信息 ===")
for employee in employees:
print(employee.get_info())
# 演示多态:同样的方法,不同的行为
print("\n=== 奖金计算(多态演示)===")
total_bonus = 0
for employee in employees:
bonus = employee.calculate_bonus()
print(f"{employee.name} 的奖金: {bonus:.2f}元")
total_bonus += bonus
print(f"\n总奖金支出: {total_bonus:.2f}元")类方法 vs 静态方法 vs 实例方法
class Student:
# 类属性(所有对象共享)
school_name = "阳光中学"
total_students = 0
def __init__(self, name, grade):
self.name = name # 实例属性
self.grade = grade
Student.total_students += 1 # 更新类属性
# 实例方法 - 操作实例数据
def introduce(self):
print(f"我是{self.name},在{self.school_name}读{self.grade}")
# 类方法 - 操作类数据,第一个参数是cls
@classmethod
def get_total_students(cls):
return cls.total_students
@classmethod
def create_from_string(cls, student_string):
"""从字符串创建学生对象 - 类方法作为工厂方法"""
name, grade = student_string.split(",")
return cls(name.strip(), grade.strip())
@classmethod
def change_school_name(cls, new_name):
cls.school_name = new_name
print(f"学校已更名为: {new_name}")
# 静态方法 - 不操作类或实例数据
@staticmethod
def is_valid_grade(grade):
"""验证年级格式"""
valid_grades = ["初一", "初二", "初三", "高一", "高二", "高三"]
return grade in valid_grades
@staticmethod
def calculate_grade_average(scores):
"""计算平均分"""
if not scores:
return 0
return sum(scores) / len(scores)
# 测试各种方法
print("=== 实例方法测试 ===")
student1 = Student("小明", "高三")
student1.introduce()
print("\n=== 类方法测试 ===")
print(f"总学生数: {Student.get_total_students()}")
# 使用类方法创建对象
student2 = Student.create_from_string("小红, 高二")
student2.introduce()
Student.change_school_name("希望中学")
student1.introduce() # 所有对象都会受到影响
student2.introduce()
print("\n=== 静态方法测试 ===")
print(f"'{student1.grade}' 是有效年级: {Student.is_valid_grade(student1.grade)}")
print(f"'{大学}' 是有效年级: {Student.is_valid_grade('大学')}")
scores = [85, 92, 78, 96, 88]
print(f"成绩平均分: {Student.calculate_grade_average(scores):.2f}")
print(f"\n当前总学生数: {Student.get_total_students()}")小结
class Book:
"""图书类"""
total_books = 0
def __init__(self, title, author, isbn, total_copies=1):
self.title = title
self.author = author
self.isbn = isbn
self.total_copies = total_copies
self.available_copies = total_copies
Book.total_books += 1
def borrow(self):
"""借书"""
if self.available_copies > 0:
self.available_copies -= 1
return True
return False
def return_book(self):
"""还书"""
if self.available_copies < self.total_copies:
self.available_copies += 1
return True
return False
def get_info(self):
return (f"《{self.title}》 - {self.author} "
f"(ISBN: {self.isbn}) "
f"可用: {self.available_copies}/{self.total_copies}")
@classmethod
def get_total_books_count(cls):
return cls.total_books
class Member:
"""会员类"""
def __init__(self, member_id, name):
self.member_id = member_id
self.name = name
self.borrowed_books = [] # 借阅的图书列表
def borrow_book(self, book):
"""借书"""
if len(self.borrowed_books) >= 5:
print(f"{self.name} 已达到最大借书数量(5本)")
return False
if book.borrow():
self.borrowed_books.append(book)
print(f"{self.name} 成功借阅 《{book.title}》")
return True
else:
print(f"《{book.title}》 暂无可用副本")
return False
def return_book(self, book):
"""还书"""
if book in self.borrowed_books:
book.return_book()
self.borrowed_books.remove(book)
print(f"{self.name} 成功归还 《{book.title}》")
return True
else:
print(f"{self.name} 没有借阅 《{book.title}》")
return False
def display_borrowed_books(self):
"""显示借阅的书籍"""
if not self.borrowed_books:
print(f"{self.name} 没有借阅任何书籍")
else:
print(f"{self.name} 借阅的书籍:")
for book in self.borrowed_books:
print(f" - 《{book.title}》")
class Library:
"""图书馆类"""
def __init__(self, name):
self.name = name
self.books = [] # 图书列表
self.members = [] # 会员列表
def add_book(self, book):
"""添加图书"""
self.books.append(book)
print(f"添加图书: 《{book.title}》")
def register_member(self, member):
"""注册会员"""
self.members.append(member)
print(f"注册会员: {member.name}")
def find_book(self, title):
"""查找图书"""
for book in self.books:
if book.title.lower() == title.lower():
return book
return None
def find_member(self, member_id):
"""查找会员"""
for member in self.members:
if member.member_id == member_id:
return member
return None
def display_all_books(self):
"""显示所有图书"""
print(f"\n=== {self.name} 图书列表 ===")
if not self.books:
print("暂无图书")
else:
for book in self.books:
print(f" {book.get_info()}")
def display_all_members(self):
"""显示所有会员"""
print(f"\n=== {self.name} 会员列表 ===")
if not self.members:
print("暂无会员")
else:
for member in self.members:
print(f" 会员ID: {member.member_id}, 姓名: {member.name}")
# 测试图书馆系统
def main():
# 创建图书馆
library = Library("市立图书馆")
# 添加图书
book1 = Book("Python编程入门", "张三", "978-1-123456-78-9", 3)
book2 = Book("数据结构与算法", "李四", "978-1-987654-32-1", 2)
book3 = Book("人工智能基础", "王五", "978-1-111111-11-1", 1)
library.add_book(book1)
library.add_book(book2)
library.add_book(book3)
# 注册会员
member1 = Member("M001", "小明")
member2 = Member("M002", "小红")
library.register_member(member1)
library.register_member(member2)
# 显示初始状态
library.display_all_books()
library.display_all_members()
print("\n=== 借书操作 ===")
# 借书
member1.borrow_book(book1)
member1.borrow_book(book2)
member2.borrow_book(book1)
member2.borrow_book(book3)
print("\n=== 当前借阅情况 ===")
member1.display_borrowed_books()
member2.display_borrowed_books()
library.display_all_books()
print("\n=== 还书操作 ===")
# 还书
member1.return_book(book1)
member2.return_book(book3)
print("\n=== 最终状态 ===")
member1.display_borrowed_books()
member2.display_borrowed_books()
library.display_all_books()
print(f"\n图书馆总图书数量: {Book.get_total_books_count()}")
if __name__ == "__main__":
main()完成以下测试:
我能定义类和创建对象
我理解构造函数 init 的作用
我能使用封装来保护数据
我理解继承的概念并能创建子类
我知道如何重写父类方法
我理解多态的概念
我能区分实例方法、类方法和静态方法
我成功运行了图书馆管理系统
我能用面向对象思维解决实际问题
- 模块化:import机制,编写自己的模块
- 标准库探索:os, sys, datetime, random
- 高级数据结构:collections模块
- 函数进阶:lambda, map, filter, reduce
- 列表推导式:高效处理数据
- 虚拟环境:venv使用,依赖管理
小Boss战:
项目:图书馆管理系统
图书类设计(书名、作者、状态)
借书还书功能
图书查询功能