定义学生类
定义 Student 类,要求:
1. 使用 __init__ 初始化 name 和 age。
2. 定义 introduce() 方法,输出学生姓名和年龄。
3. 创建两个学生对象,分别调用 introduce()。
查看参考答案 ▼
class Student:
def __init__(self, name, age):
# self.name 表示当前对象自己的 name 属性。
# 外部传入的 name 会保存到当前对象中。
self.name = name
# self.age 表示当前对象自己的 age 属性。
# 每个对象都有自己独立的 age。
self.age = age
def introduce(self):
# self 指向调用 introduce 方法的对象。
# 如果 stu1 调用,self 就是 stu1。
# 如果 stu2 调用,self 就是 stu2。
print(f"大家好,我叫{self.name},今年{self.age}岁。")
# 创建第一个学生对象。
stu1 = Student("张三", 18)
# 创建第二个学生对象。
stu2 = Student("李四", 20)
# 两个对象分别调用同一个方法,但 self 指向不同对象。
stu1.introduce()
stu2.introduce()
✓ 正确
参考答案:class Student:
def __init__(self, name, age):
# self.name 表示当前对象自己的 name 属性。
# 外部传入的 name 会保存到当前对象中。
self.name = name
# self.age 表示当前对象自己的 age 属性。
# 每个对象都有自己独立的 age。
self.age = age
def introduce(self):
# self 指向调用 introduce 方法的对象。
# 如果 stu1 调用,self 就是 stu1。
# 如果 stu2 调用,self 就是 stu2。
print(f"大家好,我叫{self.name},今年{self.age}岁。")
# 创建第一个学生对象。
stu1 = Student("张三", 18)
# 创建第二个学生对象。
stu2 = Student("李四", 20)
# 两个对象分别调用同一个方法,但 self 指向不同对象。
stu1.introduce()
stu2.introduce()
定义手机类并打印对象信息
定义 Phone 类,要求:
1. 使用 __init__ 初始化 brand 和 price。
2. 定义 call() 方法,输出"某品牌手机正在打电话"。
3. 定义 __str__() 方法,打印对象时显示品牌和价格。
4. 创建两个手机对象并测试。
查看参考答案 ▼
class Phone:
def __init__(self, brand, price):
# 初始化手机品牌。
self.brand = brand
# 初始化手机价格。
self.price = price
def call(self):
# 使用对象自己的 brand 属性输出信息。
print(f"{self.brand} 手机正在打电话。")
def __str__(self):
# 当 print(对象) 时,会自动调用 __str__。
# 返回值必须是字符串。
return f"手机品牌:{self.brand},价格:{self.price} 元"
phone1 = Phone("华为", 4999)
phone2 = Phone("小米", 2999)
# print 对象时,会触发 __str__,显示更友好的对象信息。
print(phone1)
print(phone2)
# 调用对象方法。
phone1.call()
phone2.call()
✓ 正确
参考答案:class Phone:
def __init__(self, brand, price):
# 初始化手机品牌。
self.brand = brand
# 初始化手机价格。
self.price = price
def call(self):
# 使用对象自己的 brand 属性输出信息。
print(f"{self.brand} 手机正在打电话。")
def __str__(self):
# 当 print(对象) 时,会自动调用 __str__。
# 返回值必须是字符串。
return f"手机品牌:{self.brand},价格:{self.price} 元"
phone1 = Phone("华为", 4999)
phone2 = Phone("小米", 2999)
# print 对象时,会触发 __str__,显示更友好的对象信息。
print(phone1)
print(phone2)
# 调用对象方法。
phone1.call()
phone2.call()
封装账号余额
定义 Account 类,要求:
1. 使用 __init__ 初始化用户名和私有余额 __balance。
2. 定义 get_balance() 方法,返回余额。
3. 定义 deposit(amount) 方法,充值金额。
4. 创建对象并测试充值前后余额。
查看参考答案 ▼
class Account:
def __init__(self, username, balance):
# 普通属性:用户名可以正常访问。
self.username = username
# 私有属性:余额不希望类外部随意修改。
# 加双下划线后,类外部不能直接通过 对象.__balance 访问。
self.__balance = balance
def get_balance(self):
# 提供一个公开方法,用来安全读取私有余额。
return self.__balance
def deposit(self, amount):
# 充值前先判断金额是否合法。
if amount <= 0:
print("充值金额必须大于 0")
return
# 修改私有属性时,在类内部完成。
self.__balance += amount
print(f"{self.username} 充值 {amount} 元成功,当前余额:{self.__balance} 元")
account = Account("张三", 100)
# 通过 get_balance 安全读取余额。
print("充值前余额:", account.get_balance())
# 调用充值方法。
account.deposit(50)
# 再次查看余额。
print("充值后余额:", account.get_balance())
✓ 正确
参考答案:class Account:
def __init__(self, username, balance):
# 普通属性:用户名可以正常访问。
self.username = username
# 私有属性:余额不希望类外部随意修改。
# 加双下划线后,类外部不能直接通过 对象.__balance 访问。
self.__balance = balance
def get_balance(self):
# 提供一个公开方法,用来安全读取私有余额。
return self.__balance
def deposit(self, amount):
# 充值前先判断金额是否合法。
if amount <= 0:
print("充值金额必须大于 0")
return
# 修改私有属性时,在类内部完成。
self.__balance += amount
print(f"{self.username} 充值 {amount} 元成功,当前余额:{self.__balance} 元")
account = Account("张三", 100)
# 通过 get_balance 安全读取余额。
print("充值前余额:", account.get_balance())
# 调用充值方法。
account.deposit(50)
# 再次查看余额。
print("充值后余额:", account.get_balance())
减肥案例升级版
定义 Person 类,要求:
1. 属性:name、weight。
2. run():每次跑步体重减少 0.5kg。
3. eat():每次吃饭体重增加 1kg。
4. 创建两个对象,验证两个人体重互不影响。
查看参考答案 ▼
class Person:
def __init__(self, name, weight):
# 姓名属性。
self.name = name
# 体重属性。
# 每个对象都有自己的 weight,互不影响。
self.weight = weight
def run(self):
# 跑步后,当前对象自己的体重减少 0.5。
self.weight -= 0.5
print(f"{self.name} 跑步后体重为:{self.weight}kg")
def eat(self):
# 吃饭后,当前对象自己的体重增加 1。
self.weight += 1
print(f"{self.name} 吃饭后体重为:{self.weight}kg")
xiaoming = Person("小明", 80)
xiaohong = Person("小红", 55)
# 小明的行为只影响小明自己的体重。
xiaoming.run()
xiaoming.eat()
# 小红的行为只影响小红自己的体重。
xiaohong.run()
# 打印结果可以看到两个对象的数据互不影响。
print("小明最终体重:", xiaoming.weight)
print("小红最终体重:", xiaohong.weight)
✓ 正确
参考答案:class Person:
def __init__(self, name, weight):
# 姓名属性。
self.name = name
# 体重属性。
# 每个对象都有自己的 weight,互不影响。
self.weight = weight
def run(self):
# 跑步后,当前对象自己的体重减少 0.5。
self.weight -= 0.5
print(f"{self.name} 跑步后体重为:{self.weight}kg")
def eat(self):
# 吃饭后,当前对象自己的体重增加 1。
self.weight += 1
print(f"{self.name} 吃饭后体重为:{self.weight}kg")
xiaoming = Person("小明", 80)
xiaohong = Person("小红", 55)
# 小明的行为只影响小明自己的体重。
xiaoming.run()
xiaoming.eat()
# 小红的行为只影响小红自己的体重。
xiaohong.run()
# 打印结果可以看到两个对象的数据互不影响。
print("小明最终体重:", xiaoming.weight)
print("小红最终体重:", xiaohong.weight)
AI 工具调用额度
定义 AiToolAccount 类,模拟一个 AI 工具账号,要求:
1. 属性:username、私有属性 __quota 表示剩余调用次数。
2. call_ai():每调用一次,额度减少 1。
3. 如果额度不足,提示"额度不足,请充值"。
4. recharge(count):增加调用额度。
5. get_quota():查看剩余额度。
查看参考答案 ▼
class AiToolAccount:
def __init__(self, username, quota):
# 用户名,表示当前 AI 工具账号是谁的。
self.username = username
# 私有属性:剩余调用次数。
# 不建议外部直接修改,避免额度被随意改成负数或异常值。
self.__quota = quota
def call_ai(self):
# 如果额度不足,不能继续调用。
if self.__quota <= 0:
print("额度不足,请充值")
return
# 每调用一次 AI,额度减少 1。
self.__quota -= 1
print(f"{self.username} 调用 AI 成功,剩余额度:{self.__quota}")
def recharge(self, count):
# 充值次数必须大于 0。
if count <= 0:
print("充值次数必须大于 0")
return
# 在类内部修改私有属性。
self.__quota += count
print(f"充值成功,当前额度:{self.__quota}")
def get_quota(self):
# 提供公开方法查看私有额度。
return self.__quota
account = AiToolAccount("关同学", 2)
account.call_ai()
account.call_ai()
account.call_ai()
account.recharge(3)
print("当前剩余额度:", account.get_quota())
✓ 正确
参考答案:class AiToolAccount:
def __init__(self, username, quota):
# 用户名,表示当前 AI 工具账号是谁的。
self.username = username
# 私有属性:剩余调用次数。
# 不建议外部直接修改,避免额度被随意改成负数或异常值。
self.__quota = quota
def call_ai(self):
# 如果额度不足,不能继续调用。
if self.__quota <= 0:
print("额度不足,请充值")
return
# 每调用一次 AI,额度减少 1。
self.__quota -= 1
print(f"{self.username} 调用 AI 成功,剩余额度:{self.__quota}")
def recharge(self, count):
# 充值次数必须大于 0。
if count <= 0:
print("充值次数必须大于 0")
return
# 在类内部修改私有属性。
self.__quota += count
print(f"充值成功,当前额度:{self.__quota}")
def get_quota(self):
# 提供公开方法查看私有额度。
return self.__quota
account = AiToolAccount("关同学", 2)
account.call_ai()
account.call_ai()
account.call_ai()
account.recharge(3)
print("当前剩余额度:", account.get_quota())
烤地瓜增加重置功能
定义 SweetPotato 类,要求:
1. 属性:cook_time、cook_state、condiments。
2. cook(time):累计烤制时间,并根据总时间更新状态。
3. add_condiment(name):添加调料。
4. reset():把时间恢复为 0,状态恢复为"生的",调料清空。
5. 定义 __str__() 返回当前状态。
查看参考答案 ▼
class SweetPotato:
def __init__(self):
# 烤制总时间,初始为 0。
self.cook_time = 0
# 当前状态,初始是生的。
self.cook_state = "生的"
# 调料列表,初始为空。
self.condiments = []
def cook(self, time):
# 注意这里必须使用 +=。
# 因为烤制时间应该累计,而不是每次覆盖。
self.cook_time += time
# 根据累计时间更新状态。
if 0 <= self.cook_time < 3:
self.cook_state = "生的"
elif 3 <= self.cook_time < 7:
self.cook_state = "半生不熟"
elif 7 <= self.cook_time <= 12:
self.cook_state = "熟了"
else:
self.cook_state = "糊了"
def add_condiment(self, name):
# append 用来给列表追加一个调料。
self.condiments.append(name)
def reset(self):
# 重置时间。
self.cook_time = 0
# 重置状态。
self.cook_state = "生的"
# 清空调料。
self.condiments = []
def __str__(self):
# 返回对象当前状态,方便 print(对象)。
return f"烤制时间:{self.cook_time}分钟,状态:{self.cook_state},调料:{self.condiments}"
potato = SweetPotato()
potato.cook(5)
potato.add_condiment("辣椒面")
print(potato)
potato.reset()
print("重置后:", potato)
✓ 正确
参考答案:class SweetPotato:
def __init__(self):
# 烤制总时间,初始为 0。
self.cook_time = 0
# 当前状态,初始是生的。
self.cook_state = "生的"
# 调料列表,初始为空。
self.condiments = []
def cook(self, time):
# 注意这里必须使用 +=。
# 因为烤制时间应该累计,而不是每次覆盖。
self.cook_time += time
# 根据累计时间更新状态。
if 0 <= self.cook_time < 3:
self.cook_state = "生的"
elif 3 <= self.cook_time < 7:
self.cook_state = "半生不熟"
elif 7 <= self.cook_time <= 12:
self.cook_state = "熟了"
else:
self.cook_state = "糊了"
def add_condiment(self, name):
# append 用来给列表追加一个调料。
self.condiments.append(name)
def reset(self):
# 重置时间。
self.cook_time = 0
# 重置状态。
self.cook_state = "生的"
# 清空调料。
self.condiments = []
def __str__(self):
# 返回对象当前状态,方便 print(对象)。
return f"烤制时间:{self.cook_time}分钟,状态:{self.cook_state},调料:{self.condiments}"
potato = SweetPotato()
potato.cook(5)
potato.add_condiment("辣椒面")
print(potato)
potato.reset()
print("重置后:", potato)
综合案例 1:学生成绩管理
定义 ScoreStudent 类,要求:
1. 属性:name、私有属性 __score。
2. 分数必须在 0-100 之间。
3. set_score(score):修改分数,非法分数不允许修改。
4. get_score():返回当前分数。
5. is_pass():判断是否及格。
6. __str__():打印对象时显示学生姓名、分数、是否及格。
7. 创建至少两个学生对象测试。
查看参考答案 ▼
class ScoreStudent:
def __init__(self, name, score):
# 学生姓名。
self.name = name
# 私有分数属性。
# 为了保证分数始终合法,不让外部随便改。
self.__score = 0
# 初始化时也通过 set_score 进行校验。
self.set_score(score)
def set_score(self, score):
# 分数必须在 0 到 100 之间。
if 0 <= score <= 100:
self.__score = score
else:
print("分数必须在 0-100 之间,本次修改无效")
def get_score(self):
# 通过公开方法读取私有分数。
return self.__score
def is_pass(self):
# 分数大于等于 60 表示及格。
return self.__score >= 60
def __str__(self):
# 根据 is_pass 的结果生成文字。
result = "及格" if self.is_pass() else "不及格"
return f"学生:{self.name},分数:{self.__score},结果:{result}"
stu1 = ScoreStudent("张三", 88)
stu2 = ScoreStudent("李四", 50)
print(stu1)
print(stu2)
# 尝试设置非法分数。
stu1.set_score(150)
print(stu1)
# 设置合法分数。
stu2.set_score(70)
print(stu2)
✓ 正确
参考答案:class ScoreStudent:
def __init__(self, name, score):
# 学生姓名。
self.name = name
# 私有分数属性。
# 为了保证分数始终合法,不让外部随便改。
self.__score = 0
# 初始化时也通过 set_score 进行校验。
self.set_score(score)
def set_score(self, score):
# 分数必须在 0 到 100 之间。
if 0 <= score <= 100:
self.__score = score
else:
print("分数必须在 0-100 之间,本次修改无效")
def get_score(self):
# 通过公开方法读取私有分数。
return self.__score
def is_pass(self):
# 分数大于等于 60 表示及格。
return self.__score >= 60
def __str__(self):
# 根据 is_pass 的结果生成文字。
result = "及格" if self.is_pass() else "不及格"
return f"学生:{self.name},分数:{self.__score},结果:{result}"
stu1 = ScoreStudent("张三", 88)
stu2 = ScoreStudent("李四", 50)
print(stu1)
print(stu2)
# 尝试设置非法分数。
stu1.set_score(150)
print(stu1)
# 设置合法分数。
stu2.set_score(70)
print(stu2)
综合案例 2:AI 服务套餐账号
定义 AiServicePlan 类,模拟一个 AI 服务套餐账号,要求:
1. 属性:username、plan_name、私有属性 __remain_tokens。
2. use_tokens(count):使用指定 token 数。
3. 如果 token 足够,扣减并提示剩余 token。
4. 如果 token 不足,提示"不足以完成本次调用"。
5. upgrade_plan(new_plan, add_tokens):升级套餐并增加 token。
6. get_remain_tokens():查看剩余 token。
7. __str__():返回账号、套餐、剩余 token 信息。
查看参考答案 ▼
class AiServicePlan:
def __init__(self, username, plan_name, remain_tokens):
# 用户名。
self.username = username
# 套餐名称,例如 basic、pro、team。
self.plan_name = plan_name
# 私有属性:剩余 token 数。
# token 是大模型调用中常见的计量单位。
self.__remain_tokens = remain_tokens
def use_tokens(self, count):
# 使用 token 数必须大于 0。
if count <= 0:
print("使用 token 数必须大于 0")
return
# 如果剩余 token 不够,则不能扣减。
if count > self.__remain_tokens:
print("不足以完成本次调用,请升级套餐或充值 token")
return
# 扣减 token。
self.__remain_tokens -= count
print(f"本次使用 {count} token,剩余 {self.__remain_tokens} token")
def upgrade_plan(self, new_plan, add_tokens):
# 升级套餐名称。
self.plan_name = new_plan
# 增加 token 数。
self.__remain_tokens += add_tokens
print(f"套餐升级为 {self.plan_name},增加 {add_tokens} token")
def get_remain_tokens(self):
# 提供公开方法查看私有 token。
return self.__remain_tokens
def __str__(self):
# 返回账号当前信息。
return f"用户:{self.username},套餐:{self.plan_name},剩余 token:{self.__remain_tokens}"
plan = AiServicePlan("小明", "basic", 1000)
print(plan)
# 第一次调用,token 足够。
plan.use_tokens(300)
# 第二次调用,token 不足。
plan.use_tokens(900)
# 升级套餐并增加 token。
plan.upgrade_plan("pro", 3000)
# 再次调用。
plan.use_tokens(900)
print(plan)
print("剩余 token:", plan.get_remain_tokens())
✓ 正确
参考答案:class AiServicePlan:
def __init__(self, username, plan_name, remain_tokens):
# 用户名。
self.username = username
# 套餐名称,例如 basic、pro、team。
self.plan_name = plan_name
# 私有属性:剩余 token 数。
# token 是大模型调用中常见的计量单位。
self.__remain_tokens = remain_tokens
def use_tokens(self, count):
# 使用 token 数必须大于 0。
if count <= 0:
print("使用 token 数必须大于 0")
return
# 如果剩余 token 不够,则不能扣减。
if count > self.__remain_tokens:
print("不足以完成本次调用,请升级套餐或充值 token")
return
# 扣减 token。
self.__remain_tokens -= count
print(f"本次使用 {count} token,剩余 {self.__remain_tokens} token")
def upgrade_plan(self, new_plan, add_tokens):
# 升级套餐名称。
self.plan_name = new_plan
# 增加 token 数。
self.__remain_tokens += add_tokens
print(f"套餐升级为 {self.plan_name},增加 {add_tokens} token")
def get_remain_tokens(self):
# 提供公开方法查看私有 token。
return self.__remain_tokens
def __str__(self):
# 返回账号当前信息。
return f"用户:{self.username},套餐:{self.plan_name},剩余 token:{self.__remain_tokens}"
plan = AiServicePlan("小明", "basic", 1000)
print(plan)
# 第一次调用,token 足够。
plan.use_tokens(300)
# 第二次调用,token 不足。
plan.use_tokens(900)
# 升级套餐并增加 token。
plan.upgrade_plan("pro", 3000)
# 再次调用。
plan.use_tokens(900)
print(plan)
print("剩余 token:", plan.get_remain_tokens())