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

子类继承的__repr__未显示独有参数是否合规?如何修正?

问题解答

这种做法不符合常规。__repr__方法的核心作用是返回实例清晰、完整的字符串表示,方便调试和查看实例状态。子类继承父类的__repr__后,只能展示父类定义的属性,完全忽略子类独有的broken_phone,无法完整体现Phone实例的全部信息,这显然不合理。

修正方法

方法1:子类重写__repr__(推荐)

直接在Phone类中重写__repr__,把独有属性broken_phone加入进去。如果想复用父类的__repr__逻辑,也可以通过super()调用后拼接内容:

class Item:
    all = []
    def __init__(self, name: str, price: float, quantity: int):
        self.name = name
        self.price = price
        self.quantity = quantity
        Item.all.append(self)
    
    def __repr__(self):
        return f"Item(name='{self.name}', price={self.price}, quantity={self.quantity})"

class Phone(Item):
    all = []  # 若需单独维护Phone类的实例列表
    def __init__(self, name: str, price: float, quantity: int, broken_phone: int):
        super().__init__(name, price, quantity)
        self.broken_phone = broken_phone
        Phone.all.append(self)
    
    # 方式A:直接编写子类的__repr__
    def __repr__(self):
        return f"Phone(name='{self.name}', price={self.price}, quantity={self.quantity}, broken_phone={self.broken_phone})"
    
    # 方式B:复用父类__repr__,动态拼接子类属性(更灵活)
    # def __repr__(self):
    #     parent_repr = super().__repr__()
    #     # 截取父类repr前缀,去掉末尾括号,添加子类属性后闭合
    #     return parent_repr[:-1] + f", broken_phone={self.broken_phone})"

这样打印Phone.all时,每个Phone实例都会完整显示name、price、quantity和broken_phone四个属性。

方法2:父类实现动态属性的__repr__(适配多子类场景)

如果有多个子类且不想逐个重写__repr__,可以修改父类的__repr__,让它自动获取实例的所有属性(包括子类新增的):

class Item:
    all = []
    def __init__(self, name: str, price: float, quantity: int):
        self.name = name
        self.price = price
        self.quantity = quantity
        Item.all.append(self)
    
    def __repr__(self):
        # 获取当前实例的类名(子类实例会返回子类名称)
        class_name = self.__class__.__name__
        # 遍历实例所有属性,拼接成key=value格式
        attr_strings = [f"{key}={repr(value)}" for key, value in self.__dict__.items()]
        return f"{class_name}({', '.join(attr_strings)})"

class Phone(Item):
    all = []
    def __init__(self, name: str, price: float, quantity: int, broken_phone: int):
        super().__init__(name, price, quantity)
        self.broken_phone = broken_phone
        Phone.all.append(self)

这种方式下,不管子类新增多少属性,__repr__都会自动包含所有实例属性,无需子类额外处理。若需过滤特定属性,可在列表推导中添加判断条件。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.30 19:36:14