类继承场景下设备归属信息输出的优化方案咨询
优化Python类继承:让外设设备共享统一的位置信息输出方法
我最近从教授那里拿到一个编程任务,正在学习类继承,还不太熟练。任务要求扩展鼠标、屏幕、键盘的输出,让用户知道它们所属的计算机及所在房间。我已经完成了实现,但不确定方案是否合理,想请教有没有只需定义一次方法就能适配所有类的更优方案,并说明原因。
我的现有代码
class Room: __name = "unknown" def __init__(self, name): self.__name = name def get_name(self): return self.__name class Device: __name = "Device" def __init__(self, name): self.__name = name def as_text(self): return "%s" % (self.__name) class Computer(Device): __ip = "unknown" def __init__(self, name, ip, room): super().__init__(name) self.__ip = ip self.__room = room def as_text(self): return "%s with ip=%s" % (super().as_text(), self.__ip) class Laptop(Computer): def __init__(self, name, room, ip, with_case = True): super().__init__(name, room, ip) self.__with_case = with_case def as_text(self): if (self.__with_case): return "%s with case" % super().as_text() else: return super().as_text() class Screen(Device): __width = "1920" __height = "1080" def __init__(self, name, room, width, height, computer): super().__init__(name) self.__room = room self.__width = width self.__height = height self.__computer = computer def as_text(self): return "%s with resolution %dx%d" % (super().as_text(), self.__width, self.__height) def screen_location_computer(self): return 'The screen with the height {} and width {} is located in Room {} and belongs to the computer {}'.format(self.__height, self.__width , self.__room.get_name(), self.__computer) class Keyboard(Device): __language = 'English' def __init__(self, name, room, language, computer): super().__init__(name, room) self.__language = language self.__computer = computer def keyboard_location_computer(self): return 'The keyboard with the language {] is located in Room {} and belongs to the computer {}'.format(self.__language, self.__room.get_name(), self.__computer) class Mouse(Device): __type = 'Gaming Mouse' def __init__(self, name, room, type, computer): super().__init__(name, room) self.__type = type self.__computer = computer def mouse_location_computer(self): return 'The mouse with the type {] is located in Room {} and belongs to the computer {}'.format(self.__type, self.__room.get_name(), self.__computer)
问题分析与优化方案
先帮你梳理下现有代码的问题:鼠标、键盘、屏幕都属于外设设备,它们共享「所属房间、关联计算机」的属性,以及「输出位置信息」的需求,但你现在给每个类都写了独立的方法(screen_location_computer、keyboard_location_computer等),重复代码多,违反了DRY(Don't Repeat Yourself)原则,后期维护成本高。
核心优化思路:抽离外设基类
我们可以在Device和具体外设之间新增一个PeripheralDevice基类,把所有外设共有的属性、方法逻辑抽离到这里,实现一次定义、全子类复用。另外,原代码中双下划线的私有属性(比如__name)会导致子类/基类无法直接访问,建议改用单下划线(_name)表示受保护属性,更符合Python编码规范。
优化后代码(模板方法模式)
class Room: def __init__(self, name): self._name = name def get_name(self): return self._name class Device: def __init__(self, name): self._name = name def as_text(self): return f"{self._name}" class Computer(Device): def __init__(self, name, ip, room): super().__init__(name) self._ip = ip self._room = room def as_text(self): return f"{super().as_text()} with ip={self._ip}" class Laptop(Computer): def __init__(self, name, room, ip, with_case=True): super().__init__(name, ip, room) # 修复原代码参数顺序错误 self._with_case = with_case def as_text(self): base_text = super().as_text() return f"{base_text} with case" if self._with_case else base_text # 新增外设基类:统一处理共享逻辑 class PeripheralDevice(Device): def __init__(self, name, room, computer): super().__init__(name) self._room = room self._computer = computer # 子类必须实现:返回设备类型(如"screen") @property def device_type(self): raise NotImplementedError("子类必须定义device_type属性") # 子类必须实现:返回自身特有属性描述 def get_specific_info(self): raise NotImplementedError("子类必须实现get_specific_info方法") # 统一的位置信息输出方法:完全复用,无需子类重写 def get_location_info(self): return (f"The {self.device_type} with the {self.get_specific_info()} " f"is located in Room {self._room.get_name()} " f"and belongs to the computer {self._computer.as_text()}") # 屏幕子类:仅需实现个性化部分 class Screen(PeripheralDevice): @property def device_type(self): return "screen" def __init__(self, name, room, width, height, computer): super().__init__(name, room, computer) self._width = width self._height = height def as_text(self): return f"{super().as_text()} with resolution {self._width}x{self._height}" def get_specific_info(self): return f"height {self._height} and width {self._width}" # 键盘子类:仅需实现个性化部分 class Keyboard(PeripheralDevice): @property def device_type(self): return "keyboard" def __init__(self, name, room, language, computer): super().__init__(name, room, computer) self._language = language def as_text(self): return f"{super().as_text()} with language {self._language}" def get_specific_info(self): return f"language {self._language}" # 鼠标子类:仅需实现个性化部分 class Mouse(PeripheralDevice): @property def device_type(self): return "mouse" def __init__(self, name, room, mouse_type, computer): super().__init__(name, room, computer) self._type = mouse_type def as_text(self): return f"{super().as_text()} (type: {self._type})" def get_specific_info(self): return f"type {self._type}"
为什么这个方案更优?
- 彻底遵循DRY原则:位置信息的模板逻辑只写一次,所有外设子类直接复用,后期修改只需调整基类,全子类自动生效。
- 扩展性极强:新增外设(如打印机、耳机)时,只需继承
PeripheralDevice并实现两个简单的方法,无需重复编写位置信息逻辑。 - 代码结构更清晰:通过分层继承(
Device->Computer/PeripheralDevice),明确了设备的层级关系,符合面向对象的封装与继承思想。 - 修复原代码错误:比如
Laptop初始化时的参数顺序错误、字符串格式化的括号笔误({]改为{})等问题。
内容的提问来源于stack exchange,提问作者python_oop
相关产品推荐
相关产品推荐

