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