阶段二:进阶者 (Level 11-20)
目标:理解面向对象,掌握常用模块
任务清单:

  1. 面向对象:
    类、对象
# 现实世界:狗
# 属性:名字、品种、年龄
# 行为:叫、跑、吃

# 在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 的作用

我能使用封装来保护数据

我理解继承的概念并能创建子类

我知道如何重写父类方法

我理解多态的概念

我能区分实例方法、类方法和静态方法

我成功运行了图书馆管理系统

我能用面向对象思维解决实际问题

  1. 模块化:import机制,编写自己的模块
  2. 标准库探索:os, sys, datetime, random
  3. 高级数据结构:collections模块
  4. 函数进阶:lambda, map, filter, reduce
  5. 列表推导式:高效处理数据
  6. 虚拟环境:venv使用,依赖管理
    小Boss战:
    项目:图书馆管理系统
    图书类设计(书名、作者、状态)
    借书还书功能
    图书查询功能