You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

类继承场景下设备归属信息输出的优化方案咨询

优化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}"

为什么这个方案更优?

  1. 彻底遵循DRY原则:位置信息的模板逻辑只写一次,所有外设子类直接复用,后期修改只需调整基类,全子类自动生效。
  2. 扩展性极强:新增外设(如打印机、耳机)时,只需继承PeripheralDevice并实现两个简单的方法,无需重复编写位置信息逻辑。
  3. 代码结构更清晰:通过分层继承(Device -> Computer/PeripheralDevice),明确了设备的层级关系,符合面向对象的封装与继承思想。
  4. 修复原代码错误:比如Laptop初始化时的参数顺序错误、字符串格式化的括号笔误({]改为{})等问题。

内容的提问来源于stack exchange,提问作者python_oop

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.09 17:12:42