<think>我们已有几个面向对象编程的练习题,现在需要扩展更多练习题。根据引用内容,我们可以设计涵盖以下概念的题目:1.类的定义、属性和方法(包括动态属性添加)2.继承和多态(包括抽象类)3.特殊方法(魔术方法)的使用4.封装和访问控制(虽然没有直接提到私有属性,但可以加入)5.静态方法和类方法下面设计几个练习题:###练习题4:图形类及其面积计算设计一个抽象基类`Shape`,包含一个抽象方法`area`。然后创建两个子类`Circle`和`Rectangle`,分别实现`area`方法。要求:-`Circle`类初始化时接收半径(radius),并实现`area`方法(计算圆的面积)。-`Rectangle`类初始化时接收长(length)和宽(width),并实现`area`方法(计算矩形面积)。-使用`abc`模块来定义抽象基类。参考代码结构:```pythonfromabcimportABC,abstractmethodimportmathclassShape(ABC):@abstractmethoddefarea(self):passclassCircle(Shape):def__init__(self,radius):self.radius=radiusdefarea(self):returnmath.pi*self.radius**2classRectangle(Shape):def__init__(self,length,width):self.length=lengthself.width=widthdefarea(self):returnself.length*self.width```###练习题5:自定义字符串类设计一个类`MyString`,重写一些魔术方法,使其具有以下行为:1.初始化时接收一个字符串。2.重写`__str__`方法,当使用`print`时,输出该字符串。3.重写`__add__`方法,使两个`MyString`对象相加时,返回两个字符串连接后的新字符串(返回新的`MyString`对象)。4.重写`__eq__`方法,当两个`MyString`对象内容相同时返回`True`。示例代码:```pythonclassMyString:def__init__(self,s):self.s=sdef__str__(self):returnself.sdef__add__(self,other):returnMyString(self.s+other.s)def__eq__(self,other):returnself.s==other.s#测试s1=MyString("Hello")s2=MyString("World")s3=s1+s2#应该得到"HelloWorld"print(s3)#输出:HelloWorldprint(s1==MyString("Hello"))#输出:True```###练习题6:银行账户类(封装练习)设计一个`BankAccount`类,要求:1.账户有属性:账户名(name)、余额(balance),其中余额为私有属性。2.提供存款(deposit)和取款(withdraw)方法,取款时如果余额不足,打印提示信息。3.提供查看余额的方法(get_balance)。4.使用属性装饰器(property)来设置一个只读的账户余额属性。代码示例:```pythonclassBankAccount:def__init__(self,name,balance=0):self.name=nameself.__balance=balance#私有属性defdeposit(self,amount):ifamount>0:self.__balance+=amountprint(f"存款成功,当前余额为:{self.__balance}")else:print("存款金额必须大于0")defwithdraw(self,amount):ifamount>0:ifamount<=self.__balance:self.__balance-=amountprint(f"取款成功,当前余额为:{self.__balance}")else:print("余额不足")else:print("取款金额必须大于0")@propertydefbalance(self):returnself.__balance#测试account=BankAccount("张三",1000)account.deposit(500)#存款500account.withdraw(2000)#尝试取2000,余额不足print(account.balance)#通过属性访问余额```###练习题7:使用静态方法和类方法设计一个`Date`类,包含:1.初始化方法,接收年、月、日。2.一个实例方法`display`,以“YYYY-MM-DD”格式显示日期。3.一个类方法`from_string`,从字符串“YYYY-MM-DD”创建`Date`对象。4.一个静态方法`is_valid_date`,判断一个字符串是否为有效的日期(格式为“YYYY-MM-DD”,且年月日数值合理)。参考代码:```pythonclassDate:def__init__(self,year,month,day):self.year=yearself.month=monthself.day=daydefdisplay(self):returnf"{self.year}-{self.month:02d}-{self.day:02d}"@classmethoddeffrom_string(cls,date_string):parts=date_string.split('-')iflen(parts)!=3:raiseValueError("日期格式错误")year,month,day=int(parts[0]),int(parts[1]),int(parts[2])#这里可以调用静态方法验证ifnotcls.is_valid_date(year,month,day):raiseValueError("无效的日期")returncls(year,month,day)@staticmethoddefis_valid_date(year,month,day):ifmonth<1ormonth>12:returnFalse#简单判断每月的天数,不考虑闰年days_in_month=[31,28,31,30,31,30,31,31,30,31,30,31]ifday<1orday>days_in_month[month-1]:returnFalsereturnTrue#测试d=Date(2024,5,20)print(d.display())#2024-05-20d2=Date.from_string("2024-05-21")print(d2.display())#2024-05-21print(Date.is_valid_date(2024,13,1))#False```###练习题8:动态属性添加设计一个`Person`类,包含姓名和年龄。然后允许动态添加属性,比如添加一个职业(profession)属性。并编写一个函数,打印对象的所有属性(包括动态添加的)。提示:可以使用`__dict__`来查看对象的属性。代码示例:```pythonclassPerson:def__init__(self,name,age):self.name=nameself.age=age#创建对象p=Person("张三",20)#动态添加属性p.profession="工程师"#打印所有属性print(p.__dict__)#输出:{'name':'张三','age':20,'profession':'工程师'}```这些练习题涵盖了面向对象编程的多个方面,包括抽象类、魔术方法、封装、静态方法和类方法、动态属性等。通过练习可以加深对Python面向对象编程的理解。§§相关问题§§1.如何理解Python中的抽象基类(ABC)?2.在Python中,如何实现类的比较操作(如等于、小于)?3.什么是Python中的属性装饰器(property)?它有什么作用?4.静态方法和类方法有什么区别?5.Python中如何动态地为对象添加属性和方法?</think>以下是更多 Python 面向对象编程的练习题,涵盖继承、多态、封装、魔术方法等核心概念,并包含实际应用场景:
### 练习题 4:几何图形计算
设计一个图形类体系,包含面积计算和比较功能:
```python
from abc import ABC, abstractmethod
import math
class Shape(ABC):
@abstractmethod
def area(self):
pass
def __lt__(self, other):
return self.area() < other.area()
def __str__(self):
return f"{self.__class__.__name__} [area={self.area():.2f}]"
class Circle(Shape):
def __init__(self, radius):
self.radius = radius
def area(self):
return math.pi * self.radius**2
class Rectangle(Shape):
def __init__(self, width, height):
self.width = width
self.height = height
def area(self):
return self.width * self.height
# 测试
circle = Circle(5)
rect = Rectangle(4, 6)
print(circle) # 输出: Circle [area=78.54]
print(rect) # 输出: Rectangle [area=24.00]
print(circle > rect) # 输出: True (比较面积)
```
### 练习题 5:电商商品管理系统
实现商品类和购物车功能:
```python
class Product:
def __init__(self, name, price, stock):
self.name = name
self.price = price
self.stock = stock
def __str__(self):
return f"{self.name} - ¥{self.price:.2f} (库存: {self.stock})"
def apply_discount(self, percent):
self.price *= (1 - percent/100)
class ShoppingCart:
def __init__(self):
self.items = {}
def add_item(self, product, quantity=1):
if product.stock < quantity:
print(f"库存不足!{product.name}只剩{product.stock}件")
return
if product in self.items:
self.items[product] += quantity
else:
self.items[product] = quantity
product.stock -= quantity
def total_price(self):
return sum(product.price * qty for product, qty in self.items.items())
def __str__(self):
items_str = "\n".join(f"{product.name} x {qty}" for product, qty in self.items.items())
return f"购物车内容:\n{items_str}\n总计: ¥{self.total_price():.2f}"
# 测试
phone = Product("智能手机", 5999, 10)
laptop = Product("笔记本电脑", 8999, 5)
cart = ShoppingCart()
cart.add_item(phone, 2)
cart.add_item(laptop, 1)
print(cart)
```
### 练习题 6:学生成绩管理系统
实现学生类与成绩统计功能:
```python
class Student:
def __init__(self, name, student_id):
self.name = name
self.student_id = student_id
self.__scores = {} # 私有属性
def add_score(self, subject, score):
if 0 <= score <= 100:
self.__scores[subject] = score
else:
print("分数必须在0-100之间")
def average_score(self):
if not self.__scores:
return 0
return sum(self.__scores.values()) / len(self.__scores)
def __str__(self):
subjects = ", ".join(f"{subj}:{score}" for subj, score in self.__scores.items())
return f"学生: {self.name} (ID:{self.student_id})\n科目成绩: {subjects}\n平均分: {self.average_score():.2f}"
# 测试
student = Student("张三", "S2023001")
student.add_score("数学", 85)
student.add_score("英语", 92)
student.add_score("编程", 78)
print(student)
```
### 练习题 7:图书馆管理系统
实现图书和借阅功能:
```python
class Book:
def __init__(self, title, author, isbn):
self.title = title
self.author = author
self.isbn = isbn
self.available = True
def __str__(self):
status = "可借阅" if self.available else "已借出"
return f"《{self.title}》- {self.author} [{status}]"
class Library:
def __init__(self):
self.books = []
def add_book(self, book):
self.books.append(book)
def find_book(self, title):
return [book for book in self.books if title.lower() in book.title.lower()]
def borrow_book(self, isbn):
for book in self.books:
if book.isbn == isbn and book.available:
book.available = False
return book
return None
# 测试
library = Library()
library.add_book(Book("Python编程", "Eric Matthes", "978-7-115-45374-9"))
library.add_book(Book("算法导论", "Thomas Cormen", "978-7-111-40701-0"))
print("搜索结果:")
for book in library.find_book("python"):
print(book)
# 借阅书籍
borrowed = library.borrow_book("978-7-115-45374-9")
if borrowed:
print(f"\n已借阅: {borrowed.title}")
```
### 练习题 8:游戏角色系统
实现游戏角色与技能继承:
```python
class GameCharacter:
def __init__(self, name, health):
self.name = name
self.health = health
def attack(self):
print(f"{self.name}发起普通攻击!")
def __str__(self):
return f"{self.name} [生命值: {self.health}]"
class Warrior(GameCharacter):
def __init__(self, name, health, strength):
super().__init__(name, health)
self.strength = strength
def attack(self):
print(f"{self.name}使用重剑造成{self.strength}点伤害!")
def special_skill(self):
print(f"{self.name}发动旋风斩!")
class Mage(GameCharacter):
def __init__(self, name, health, magic_power):
super().__init__(name, health)
self.magic_power = magic_power
def attack(self):
print(f"{self.name}发射魔法飞弹造成{self.magic_power//2}点伤害!")
def cast_spell(self):
print(f"{self.name}施放火球术造成{self.magic_power}点伤害!")
# 测试
warrior = Warrior("亚瑟", 150, 25)
mage = Mage("梅林", 80, 40)
characters = [warrior, mage]
for char in characters:
char.attack() # 多态表现
warrior.special_skill()
mage.cast_spell()
```
### 练习题 9:温度转换类
实现温度单位转换和格式化输出:
```python
class Temperature:
def __init__(self, celsius):
self.celsius = celsius
@property
def fahrenheit(self):
return (self.celsius * 9/5) + 32
@fahrenheit.setter
def fahrenheit(self, value):
self.celsius = (value - 32) * 5/9
def __str__(self):
return f"{self.celsius:.1f}°C / {self.fahrenheit:.1f}°F"
def __add__(self, other):
return Temperature(self.celsius + other.celsius)
# 测试
t1 = Temperature(25)
print(f"初始温度: {t1}") # 25.0°C / 77.0°F
t1.fahrenheit = 100
print(f"设置华氏100度: {t1}") # 37.8°C / 100.0°F
t2 = Temperature(10)
t3 = t1 + t2
print(f"温度相加: {t3}") # 47.8°C / 118.0°F
```
### 练习题 10:银行账户继承体系
实现账户类型继承和交易记录:
```python
class BankAccount:
def __init__(self, account_number, balance=0):
self.account_number = account_number
self.balance = balance
self.transactions = []
def deposit(self, amount):
if amount > 0:
self.balance += amount
self.transactions.append(('存款', amount))
def withdraw(self, amount):
if 0 < amount <= self.balance:
self.balance -= amount
self.transactions.append(('取款', amount))
return amount
print("取款失败,余额不足")
return 0
def __str__(self):
return f"账户: {self.account_number} 余额: ¥{self.balance:.2f}"
class SavingsAccount(BankAccount):
def __init__(self, account_number, balance=0, interest_rate=1.5):
super().__init__(account_number, balance)
self.interest_rate = interest_rate
def add_interest(self):
interest = self.balance * self.interest_rate / 100
self.deposit(interest)
return interest
# 测试
savings = SavingsAccount("SAV-001", 10000)
savings.deposit(5000)
savings.withdraw(2000)
interest = savings.add_interest()
print(savings)
print(f"最近交易: {savings.transactions[-3:]}")
print(f"添加利息: ¥{interest:.2f}")
```
这些练习题涵盖了面向对象编程的主要概念:
1. 类与对象的基本使用
2. 继承与多态的应用
3. 封装与访问控制(私有属性)
4. 魔术方法的使用(`__str__`, `__add__`, `__lt__`等)
5. 属性装饰器(@property)
6. 抽象基类(ABC)
7. 类关系设计(组合与继承)
通过完成这些练习,可以全面掌握 Python 面向对象编程的核心技能和设计模式。