子类继承的__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
相关产品推荐
相关产品推荐

