哪些Python案例展示了面向对象编程?

wen python案例 4

本文目录导读:

哪些Python案例展示了面向对象编程?

  1. 银行账户系统(封装 + 继承)
  2. 动物声音模拟(多态)
  3. 员工管理系统(组合 + 类方法)
  4. 图书馆借阅系统(综合案例)
  5. OOP 核心概念总结表

银行账户系统(封装 + 继承)

class BankAccount:
    """基础银行账户类"""
    def __init__(self, account_number, owner, balance=0):
        self.account_number = account_number  # 公开属性
        self.owner = owner
        self.__balance = balance  # 私有属性(封装)
    def deposit(self, amount):
        """存款"""
        if amount > 0:
            self.__balance += amount
            print(f"存款 {amount},当前余额:{self.__balance}")
        else:
            print("存款金额必须为正数")
    def withdraw(self, amount):
        """取款(带验证)"""
        if 0 < amount <= self.__balance:
            self.__balance -= amount
            print(f"取款 {amount},当前余额:{self.__balance}")
        else:
            print("余额不足或金额无效")
    def get_balance(self):
        """获取余额(通过方法访问私有属性)"""
        return self.__balance
    def __str__(self):
        return f"{self.owner}的账户 [{self.account_number}], 余额:{self.__balance}"
# 继承:储蓄账户
class SavingsAccount(BankAccount):
    """储蓄账户(有最低余额限制和利息)"""
    def __init__(self, account_number, owner, balance=0, interest_rate=0.02):
        super().__init__(account_number, owner, balance)
        self.interest_rate = interest_rate
    def withdraw(self, amount):
        """重写取款方法,增加最低余额限制"""
        if self.get_balance() - amount < 100:  # 最低余额100元
            print("取款失败:余额不能低于100元")
        else:
            super().withdraw(amount)  # 调用父类方法
    def apply_interest(self):
        """应用利息"""
        interest = self.get_balance() * self.interest_rate
        self.deposit(interest)  # 直接使用父类的deposit
        print(f"利息 {interest:.2f} 已存入")
# 使用示例
savings = SavingsAccount("123456", "张三", 1000, 0.03)
savings.deposit(500)       # 存款 500,当前余额:1500
savings.withdraw(400)      # 取款 400,当前余额:1100
savings.withdraw(800)      # 取款失败:余额不能低于100元
savings.apply_interest()   # 利息 33.00 已存入
print(savings)             # 张三的账户 [123456], 余额:1133.0

OOP 特性展示:

  • 封装__balance 私有属性,通过公共方法访问
  • 继承SavingsAccount 继承 BankAccount
  • 方法重写withdraw 方法增强功能
  • super():调用父类方法

动物声音模拟(多态)

from abc import ABC, abstractmethod
class Animal(ABC):
    """抽象基类"""
    def __init__(self, name):
        self.name = name
    @abstractmethod
    def make_sound(self):
        """抽象方法:子类必须实现"""
        pass
    def describe(self):
        """通用方法"""
        print(f"{self.name}是{self.__class__.__name__}")
class Dog(Animal):
    def make_sound(self):
        return "汪汪汪!"
    def fetch(self):
        print(f"{self.name}正在捡球")
class Cat(Animal):
    def make_sound(self):
        return "喵喵喵~"
    def purr(self):
        print(f"{self.name}在打呼噜")
class Duck(Animal):
    def make_sound(self):
        return "嘎嘎嘎!"
# 多态函数:传入任何Animal子类都能工作
def animal_concert(animals):
    for animal in animals:
        animal.describe()
        print(f"  - 声音:{animal.make_sound()}")
        print()
# 使用示例
animals = [
    Dog("旺财"),
    Cat("咪咪"),
    Duck("唐老鸭"),
    Dog("来福"),
]
animal_concert(animals)

OOP 特性展示:

  • 抽象基类(ABC):定义接口规范
  • 多态:同一接口(make_sound)不同实现
  • 鸭子类型:只要对象有 make_sound 方法就能使用

员工管理系统(组合 + 类方法)

class Department:
    """部门类(组合关系的基础)"""
    def __init__(self, name, manager=None):
        self.name = name
        self.manager = manager
        self.employees = []
    def add_employee(self, employee):
        self.employees.append(employee)
        print(f"{employee.name} 加入 {self.name}")
    def __str__(self):
        return f"部门:{self.name},员工数:{len(self.employees)}"
class Employee:
    """员工类"""
    # 类变量(所有实例共享)
    company = "XX科技有限公司"
    employee_count = 0
    def __init__(self, name, age, position, salary):
        # 实例变量(每个实例独立)
        self.name = name
        self.age = age
        self.position = position
        self.salary = salary
        self.department = None  # 初始无部门
        Employee.employee_count += 1  # 类变量递增
    def join_department(self, department):
        """加入部门(建立组合关系)"""
        self.department = department
        department.add_employee(self)
    def get_info(self):
        info = f"姓名:{self.name}, 职位:{self.position}, 薪资:{self.salary}"
        if self.department:
            info += f", 部门:{self.department.name}"
        return info
    @classmethod
    def create_manager(cls, name, age, salary):
        """类方法:创建经理(固定的职位)"""
        return cls(name, age, "部门经理", salary)
    @staticmethod
    def validate_salary(salary):
        """静态方法:验证薪资合法性"""
        return salary > 0 and salary < 1000000
# 使用示例
# 创建部门
engineering = Department("研发部")
marketing = Department("市场部")
# 通过类方法创建经理
zhang = Employee.create_manager("张经理", 35, 30000)
li = Employee.create_manager("李经理", 32, 28000)
# 创建普通员工
wang = Employee("王工", 28, "高级工程师", 20000)
zhao = Employee("赵工", 25, "软件工程师", 15000)
chen = Employee("陈专员", 26, "市场专员", 12000)
# 建立组合关系
wang.join_department(engineering)
zhao.join_department(engineering)
chen.join_department(marketing)
zhang.join_department(engineering)  # 经理也是员工
# 显示信息
print(f"公司:{Employee.company}")   # 公司:XX科技有限公司
print(f"员工总数:{Employee.employee_count}")  # 员工总数:5
print(engineering)  # 部门:研发部,员工数:3
print(wang.get_info())
print(Employee.validate_salary(500000))  # False

OOP 特性展示:

  • 组合:Employee 包含 Department 引用
  • 类变量/类方法employee_countcreate_manager
  • 静态方法validate_salary
  • 关联关系:双向关联(员工知道部门,部门知道员工)

图书馆借阅系统(综合案例)

import datetime
class Book:
    """图书类"""
    def __init__(self, isbn, title, author, total_copies):
        self.isbn = isbn
        self.title = title
        self.author = author
        self.total_copies = total_copies
        self.available_copies = total_copies  # 可借数量
    def is_available(self):
        return self.available_copies > 0
    def borrow(self):
        if self.is_available():
            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 __str__(self):
        return f"《{self.title}》 by {self.author} (剩余{self.available_copies}/{self.total_copies})"
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} 已达到最大借阅数量")
            return False
        if book.borrow():
            self.borrowed_books.append({
                'book': book,
                'borrow_date': datetime.date.today()
            })
            print(f"{self.name} 借阅《{book.title}》成功")
            return True
        else:
            print(f"《{book.title}》暂无库存")
            return False
    def return_book(self, book):
        for record in self.borrowed_books:
            if record['book'] is book:
                book.return_book()
                self.borrowed_books.remove(record)
                print(f"{self.name} 归还《{book.title}》成功")
                return True
        print(f"{self.name} 没有借阅《{book.title}》")
        return False
    def __str__(self):
        return f"会员:{self.name} (ID:{self.member_id}), 已借{len(self.borrowed_books)}本"
class Library:
    """图书馆类(管理所有书籍和会员)"""
    def __init__(self, name):
        self.name = name
        self.books = {}
        self.members = {}
    def add_book(self, book):
        self.books[book.isbn] = book
        print(f"添加图书:{book}")
    def register_member(self, member):
        self.members[member.member_id] = member
        print(f"注册会员:{member}")
    def borrow_book(self, member_id, isbn):
        member = self.members.get(member_id)
        book = self.books.get(isbn)
        if member and book:
            member.borrow_book(book)
        else:
            print("会员或图书不存在")
    def return_book(self, member_id, isbn):
        member = self.members.get(member_id)
        book = self.books.get(isbn)
        if member and book:
            member.return_book(book)
        else:
            print("会员或图书不存在")
    def display_status(self):
        print(f"\n=== {self.name} 当前状态 ===")
        print("图书库存:")
        for book in self.books.values():
            print(f"  {book}")
        print("会员信息:")
        for member in self.members.values():
            print(f"  {member}")
# 使用示例
library = Library("智慧图书馆")
# 添加图书
library.add_book(Book("978-7-111-11111-1", "Python编程", "张三", 3))
library.add_book(Book("978-7-111-22222-2", "数据结构", "李四", 2))
library.add_book(Book("978-7-111-33333-3", "算法导论", "王五", 1))
# 注册会员
library.register_member(Member("M001", "小明"))
library.register_member(Member("M002", "小红"))
# 借还书操作
library.borrow_book("M001", "978-7-111-11111-1")  # 小明借Python编程
library.borrow_book("M001", "978-7-111-22222-2")  # 小明借数据结构
library.borrow_book("M002", "978-7-111-11111-1")  # 小红借Python编程
library.display_status()
library.return_book("M001", "978-7-111-11111-1")  # 小明还Python编程
library.display_status()

OOP 特性展示:

  • 类关系设计:Library 聚合 Book 和 Member
  • 职责分离:每个类负责自己的业务逻辑
  • 对象交互:Member 与 Book 协同完成借阅
  • 封装:内部状态通过方法管理

OOP 核心概念总结表

概念 案例位置 说明
封装 银行账户 __balance 隐藏内部数据,通过方法访问
继承 SavingsAccount -> BankAccount 复用父类代码,扩展新功能
多态 Animal -> Dog/Cat/Duck 统一接口,不同实现
抽象 Animal 抽象基类 定义接口规范
组合 Employee + Department “has-a”关系
类方法 Employee.create_manager 工厂方法模式
静态方法 Employee.validate_salary 工具函数,无关实例

这些案例从简单到复杂,展示了 Python OOP 的主要特性,建议先理解前两个案例,然后尝试自己修改和扩展代码来加深理解。

抱歉,评论功能暂时关闭!