类基础

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

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())