类基础

学习面向对象编程的核心概念,创建可复用的对象模板

1. 类定义语法

类是创建对象的蓝图或模板。它定义了对象的属性和方法。Python使用 class 关键字来定义类。

# 基本类定义语法
class 类名:
    """类的文档字符串"""
    
    def __init__(self, 参数列表):
        """初始化方法"""
        self.属性名 = 参数
    
    def 方法名(self, 参数列表):
        """方法文档字符串"""
        方法体
# 实际示例
class Dog:
    """狗的类"""
    
    def __init__(self, name, age):
        """初始化狗的属性"""
        self.name = name
        self.age = age
    
    def bark(self):
        """狗叫的方法"""
        return f"{self.name} 说:汪汪!"

# 创建实例
dog1 = Dog("小黑", 3)
print(dog1.bark())  # 输出:小黑 说:汪汪!

2. 类的实例化

实例化是根据类创建具体对象的过程。每个实例都有自己的属性值。

class Student:
    """学生类"""
    
    def __init__(self, name, student_id, grade):
        self.name = name
        self.student_id = student_id
        self.grade = grade
    
    def introduce(self):
        return f"我是{self.name},学号{self.student_id},{self.grade}年级"

# 创建多个实例
student1 = Student("张三", "2023001", "三")
student2 = Student("李四", "2023002", "四")

print(student1.introduce())  # 我是张三,学号2023001,三年级
print(student2.introduce())  # 我是李四,学号2023002,四年级

3. 属性和方法

属性(变量)

  • • 实例属性:每个对象独有
  • • 类属性:所有对象共享
  • • 通过self访问实例属性

方法(函数)

  • • 实例方法:操作对象属性
  • • 类方法:操作类属性
  • • 静态方法:与类无关的函数
class BankAccount:
    """银行账户类"""
    
    # 类属性
    bank_name = "智能银行"
    
    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
            return f"成功存入¥{amount}"
        return "存款金额必须大于0"
    
    def withdraw(self, amount):
        """取款方法"""
        if amount <= self.balance:
            self.balance -= amount
            return f"成功取出¥{amount}"
        return "余额不足"
    
    def get_balance(self):
        """查询余额"""
        return f"当前余额:¥{self.balance}"

4. 继承

继承允许一个类(子类)继承另一个类(父类)的属性和方法,实现代码复用。

# 父类
class Animal:
    def __init__(self, name):
        self.name = name
    
    def speak(self):
        return f"{self.name} 发出声音"

# 子类
class Cat(Animal):
    def __init__(self, name, color):
        super().__init__(name)  # 调用父类初始化
        self.color = color
    
    def speak(self):
        return f"{self.name} 说:喵喵!"

class Dog(Animal):
    def speak(self):
        return f"{self.name} 说:汪汪!"

# 使用
my_cat = Cat("咪咪", "白色")
my_dog = Dog("旺财")

print(my_cat.speak())  # 咪咪 说:喵喵!
print(my_dog.speak())  # 旺财 说:汪汪!

5. 多态

多态允许不同类的对象对同一方法调用做出不同响应,提高代码的灵活性。

class Shape:
    def area(self):
        return 0

class Rectangle(Shape):
    def __init__(self, width, height):
        self.width = width
        self.height = height
    
    def area(self):
        return self.width * self.height

class Circle(Shape):
    def __init__(self, radius):
        self.radius = radius
    
    def area(self):
        return 3.14 * self.radius ** 2

# 多态示例
def print_area(shape):
    print(f"面积:{shape.area()}")

# 使用
rect = Rectangle(5, 3)
circle = Circle(2)

print_area(rect)    # 面积:15
print_area(circle)  # 面积:12.56

故事化案例:游戏角色系统

场景:小李正在开发一个RPG游戏,需要设计角色系统。游戏中有战士、法师、弓箭手等不同职业,每个职业都有独特的属性和技能。让我们用类来实现这个系统!

1. 基础角色类

class Character:
    """游戏角色基类"""
    
    def __init__(self, name, health, attack):
        self.name = name
        self.health = health
        self.attack = attack
        self.level = 1
    
    def attack_enemy(self):
        damage = self.attack * (1 + self.level * 0.1)
        return f"{self.name} 造成 {damage:.0f} 点伤害"
    
    def level_up(self):
        self.level += 1
        self.health += 20
        self.attack += 5
        return f"{self.name} 升级到 {self.level} 级!"
    
    def get_status(self):
        return f"{self.name} - 等级:{self.level},生命值:{self.health},攻击力:{self.attack}"

2. 具体职业类

class Warrior(Character):
    """战士类"""
    
    def __init__(self, name):
        super().__init__(name, health=150, attack=30)
        self.defense = 20
    
    def special_attack(self):
        damage = self.attack * 1.5
        return f"{self.name} 使用重击,造成 {damage:.0f} 点伤害!"

class Mage(Character):
    """法师类"""
    
    def __init__(self, name):
        super().__init__(name, health=80, attack=40)
        self.mana = 100
    
    def cast_spell(self):
        if self.mana >= 20:
            self.mana -= 20
            damage = self.attack * 2
            return f"{self.name} 施放火球术,造成 {damage:.0f} 点魔法伤害!"
        return f"{self.name} 魔法值不足!"

class Archer(Character):
    """弓箭手类"""
    
    def __init__(self, name):
        super().__init__(name, health=100, attack=35)
        self.critical_chance = 0.3
    
    def precise_shot(self):
        import random
        if random.random() < self.critical_chance:
            damage = self.attack * 2.5
            return f"{self.name} 暴击!造成 {damage:.0f} 点伤害!"
        else:
            damage = self.attack * 1.2
            return f"{self.name} 射击,造成 {damage:.0f} 点伤害"

3. 使用角色系统

# 创建角色
warrior = Warrior("阿瑞斯")
mage = Mage("梅林")
archer = Archer("罗宾")

# 展示角色信息
print(warrior.get_status())
print(mage.get_status())
print(archer.get_status())

# 战斗演示
print("\n=== 战斗开始 ===")
print(warrior.special_attack())
print(mage.cast_spell())
print(archer.precise_shot())

# 升级
print("\n=== 升级后 ===")
warrior.level_up()
mage.level_up()
print(warrior.get_status())
print(mage.get_status())

练习题(共6个)

练习题1:学生管理系统

创建一个Student类,包含姓名、学号、成绩列表,以及添加成绩、计算平均分的方法。

class Student:
    """学生类"""
    
    def __init__(self, name, student_id):
        self.name = name
        self.student_id = student_id
        self.grades = []
    
    def add_grade(self, grade):
        """添加成绩"""
        if 0 <= grade <= 100:
            self.grades.append(grade)
            return f"已添加成绩:{grade}分"
        return "成绩必须在0-100之间"
    
    def get_average(self):
        """计算平均分"""
        if not self.grades:
            return 0
        return sum(self.grades) / len(self.grades)
    
    def get_info(self):
        """获取学生信息"""
        avg = self.get_average()
        return f"姓名:{self.name},学号:{self.student_id},平均分:{avg:.1f}"

# 使用示例
student = Student("张三", "2023001")
student.add_grade(85)
student.add_grade(92)
student.add_grade(78)
print(student.get_info())

练习题2:银行账户类

创建一个BankAccount类,支持存款、取款、转账功能,包含余额检查和交易历史记录。

class BankAccount:
    """银行账户类"""
    
    def __init__(self, account_number, owner, initial_balance=0):
        self.account_number = account_number
        self.owner = owner
        self.balance = initial_balance
        self.transactions = []
    
    def deposit(self, amount):
        """存款"""
        if amount > 0:
            self.balance += amount
            self.transactions.append(f"存款:+¥{amount}")
            return True
        return False
    
    def withdraw(self, amount):
        """取款"""
        if 0 < amount <= self.balance:
            self.balance -= amount
            self.transactions.append(f"取款:-¥{amount}")
            return True
        return False
    
    def transfer(self, amount, target_account):
        """转账"""
        if self.withdraw(amount):
            target_account.deposit(amount)
            self.transactions.append(f"转账给 {target_account.account_number}:-¥{amount}")
            return True
        return False
    
    def get_balance(self):
        return f"当前余额:¥{self.balance}"
    
    def get_transactions(self):
        return self.transactions

# 使用示例
account1 = BankAccount("1001", "张三", 1000)
account2 = BankAccount("1002", "李四", 500)

account1.transfer(200, account2)
print(account1.get_balance())
print(account1.get_transactions())

练习题3:图书管理系统

创建Book和Library类,支持添加图书、借出图书、归还图书、查询图书状态功能。

class Book:
    """图书类"""
    
    def __init__(self, title, author, isbn):
        self.title = title
        self.author = author
        self.isbn = isbn
        self.is_available = True
        self.borrower = None
    
    def borrow(self, borrower):
        """借出图书"""
        if self.is_available:
            self.is_available = False
            self.borrower = borrower
            return f"《{self.title}》已借给 {borrower}"
        return f"《{self.title}》已被借出"
    
    def return_book(self):
        """归还图书"""
        if not self.is_available:
            self.is_available = True
            borrower = self.borrower
            self.borrower = None
            return f"《{self.title}》已由 {borrower} 归还"
        return f"《{self.title}》未被借出"

class Library:
    """图书馆类"""
    
    def __init__(self, name):
        self.name = name
        self.books = []
    
    def add_book(self, book):
        """添加图书"""
        self.books.append(book)
        return f"已添加《{book.title}》"
    
    def find_book(self, title):
        """查找图书"""
        for book in self.books:
            if book.title == title:
                return book
        return None
    
    def get_available_books(self):
        """获取可借图书"""
        return [book for book in self.books if book.is_available]

# 使用示例
library = Library("城市图书馆")
book1 = Book("Python编程", "张三", "12345")
library.add_book(book1)
print(book1.borrow("李四"))
print(library.get_available_books())

练习题4:车辆继承体系

创建Vehicle基类和Car、Motorcycle子类,实现不同车辆的属性和方法。

class Vehicle:
    """车辆基类"""
    
    def __init__(self, brand, model, year):
        self.brand = brand
        self.model = model
        self.year = year
        self.is_running = False
    
    def start_engine(self):
        """启动引擎"""
        if not self.is_running:
            self.is_running = True
            return f"{self.brand} {self.model} 引擎已启动"
        return "引擎已经在运行"
    
    def stop_engine(self):
        """停止引擎"""
        if self.is_running:
            self.is_running = False
            return f"{self.brand} {self.model} 引擎已停止"
        return "引擎已停止"

class Car(Vehicle):
    """汽车类"""
    
    def __init__(self, brand, model, year, doors):
        super().__init__(brand, model, year)
        self.doors = doors
    
    def honk(self):
        return f"{self.brand} {self.model} 发出哔哔声!"

class Motorcycle(Vehicle):
    """摩托车类"""
    
    def __init__(self, brand, model, year, type):
        super().__init__(brand, model, year)
        self.type = type  # 类型:sport/cruiser
    
    def wheelie(self):
        if self.is_running:
            return f"{self.brand} {self.model} 表演翘头特技!"
        return "请先启动引擎"

# 使用示例
car = Car("丰田", "凯美瑞", 2023, 4)
motorcycle = Motorcycle("本田", "CBR500R", 2023, "sport")

print(car.start_engine())
print(motorcycle.start_engine())
print(car.honk())
print(motorcycle.wheelie())

练习题5:员工管理系统

创建Employee基类和Manager、Developer子类,实现工资计算、部门管理等功能。

class Employee:
    """员工基类"""
    
    def __init__(self, name, employee_id, base_salary):
        self.name = name
        self.employee_id = employee_id
        self.base_salary = base_salary
    
    def calculate_salary(self):
        """计算工资"""
        return self.base_salary
    
    def get_info(self):
        return f"{self.name} (ID: {self.employee_id})"

class Manager(Employee):
    """经理类"""
    
    def __init__(self, name, employee_id, base_salary, bonus_rate=0.2):
        super().__init__(name, employee_id, base_salary)
        self.bonus_rate = bonus_rate
        self.team_members = []
    
    def add_team_member(self, employee):
        """添加团队成员"""
        self.team_members.append(employee)
    
    def calculate_salary(self):
        """计算经理工资(包含奖金)"""
        bonus = self.base_salary * self.bonus_rate
        return self.base_salary + bonus

class Developer(Employee):
    """开发者类"""
    
    def __init__(self, name, employee_id, base_salary, programming_language):
        super().__init__(name, employee_id, base_salary)
        self.programming_language = programming_language
        self.projects_completed = 0
    
    def complete_project(self):
        """完成项目"""
        self.projects_completed += 1
        return f"{self.name} 完成了一个项目"
    
    def calculate_salary(self):
        """计算开发者工资(项目奖金)"""
        project_bonus = self.projects_completed * 1000
        return self.base_salary + project_bonus

# 使用示例
manager = Manager("王经理", "M001", 15000)
dev1 = Developer("张程序员", "D001", 8000, "Python")
dev2 = Developer("李程序员", "D002", 8000, "Java")

manager.add_team_member(dev1)
manager.add_team_member(dev2)

print(manager.get_info(), f"工资:¥{manager.calculate_salary()}")
print(dev1.get_info(), f"工资:¥{dev1.calculate_salary()}")

练习题6:电商订单系统

基于游戏角色案例,创建一个电商订单系统,包含产品、订单、客户等类。

class Product:
    """产品类"""
    
    def __init__(self, name, price, stock):
        self.name = name
        self.price = price
        self.stock = stock
    
    def reduce_stock(self, quantity):
        """减少库存"""
        if quantity <= self.stock:
            self.stock -= quantity
            return True
        return False

class Customer:
    """客户类"""
    
    def __init__(self, name, email):
        self.name = name
        self.email = email
        self.orders = []
    
    def add_order(self, order):
        """添加订单"""
        self.orders.append(order)

class Order:
    """订单类"""
    
    def __init__(self, order_id, customer):
        self.order_id = order_id
        self.customer = customer
        self.items = []
        self.total = 0
        self.status = "待处理"
    
    def add_item(self, product, quantity):
        """添加商品"""
        if product.reduce_stock(quantity):
            self.items.append({"product": product, "quantity": quantity, "price": product.price})
            self.calculate_total()
            return f"已添加 {quantity} 个 {product.name}"
        return f"{product.name} 库存不足"
    
    def calculate_total(self):
        """计算总价"""
        self.total = sum(item["price"] * item["quantity"] for item in self.items)
    
    def complete_order(self):
        """完成订单"""
        self.status = "已完成"
        return f"订单 {self.order_id} 已完成,总价:¥{self.total}"
    
    def get_order_summary(self):
        """获取订单摘要"""
        items_summary = [f"{item['product'].name} x{item['quantity']} = ¥{item['price'] * item['quantity']}" 
                         for item in self.items]
        return {
            "订单号": self.order_id,
            "客户": self.customer.name,
            "商品": items_summary,
            "总价": f"¥{self.total}",
            "状态": self.status
        }

# 使用示例
product1 = Product("Python书籍", 89, 100)
product2 = Product("鼠标", 45, 50)

customer = Customer("张三", "zhang@example.com")
order = Order("20231118001", customer)

order.add_item(product1, 2)
order.add_item(product2, 1)
print(order.get_order_summary())
print(order.complete_order())