不了不了,我还没有系统的学习这些东西,你给我出题吧,结合我之前给你发的那些笔记,目的是让无数来弄的运用python的知识
class SmartDevice:
def __init__(self,status):
self.__status = status
@property
def status(self):
return self.__status
@status.setter
def status(self,new_status):
valid_status = ["开启","关闭","待机"]
if new_status not in valid_status:
raise ValueError(f"非法的设备状态{new_status},合格的设备状态{valid_status}")
self.__status = new_status
return self.__status
def turn_on(self):
if self.__status == "开启":
print("机器开始运行")
class AirConditioner(SmartDevice):
def init(self,status):
super().init(status)
def turn_on(self):
res = super().turn_on()
print(f’{res},开始制冷’)
class RobotVacuum(SmartDevice):
def init(self,status):
super().init(status)
def turn_on(self):
res = super().turn_on()
print(f’{res},开始扫地’)
def start_device(device):
device.turn_on()
你的代码整体架构非常清晰,父类、子类、多态函数以及 super() 的用法都完全正确。但在细节上存在几个问题,下面为你客观指出:
- 拼写错误
statue 应为 status(状态)。statue 是“雕像”的意思。
@statue.stter 拼写错误,应为 @statue.setter。 - 封装设计缺陷
你在父类 SmartDevice 中定义了私有属性 __status 和对应的 @property,但在 turn_on() 方法中,你只是返回了一个字符串,并没有真正修改 __status 的值。
这意味着,无论调用多少次 turn_on(),设备的状态依然是初始值。应该在方法内部调用 self.status = “开启” 来触发 setter 并更新状态。 - 子类缺少状态校验
在 AirConditioner 和 RobotVacuum 的 init 中,你直接将 status 传给了父类,但没有对传入的初始状态进行合法性校验。如果外部传入 status=“爆炸”,对象依然会被创建。 - 返回值与副作用混用
turn_on() 方法中,你使用了 return “机器开始运行”,但在子类中又用 print() 打印了拼接后的字符串。
如果 turn_on() 的目的是展示信息,应该统一使用 print()。
如果 turn_on() 的目的是返回状态字符串供其他地方使用,就不应该在方法内部 print()。
建议统一风格:在父类中 print() 基础状态,在子类中 print() 特有状态。 - 缺少多态测试代码
你定义了 start_device(device) 函数,但没有提供测试代码来验证多态是否生效。
以上是我的问题,我的答案,还有千问的"批评",@property和@status.setter原来就相当于是一个内置函数,我前面学到过,他们把函数的调用方式给改了,用一个“语法糖”给优化了,让不明白的人还蒙在鼓里,认为来一个 “小明” = self.name是直接修改了数据(虽然我就是吧)这里运用这些的精髓是自己定义的函数的名字就必须是自己想要隐藏的属性的名字。比如这里的 def status: 就是这个原理,暗中当老六。
有一个super()我感觉是很好用的,也不用死记硬背,super().------------(想要继承的函数) 用这个还可以在原有的基础上再加上一些其他的东西。
回顾下来就是“千问”挺好用的,关键在于自己的“问”,上面的理解就是基于我的错误还有我问的千问得出来的。
over
480



被折叠的 条评论
为什么被折叠?



