如何优化Weapon与Armour类格式提升可读性?解决实例显示问题
自定义武器与防具类的实例打印优化
现有代码
class Weapon: def __init__(self, Type, quality, material, dmg, name): self.Type = Type self.quality = quality self.name = name self.material = material self.identify = 'Melee weapon' def displayinvent(self): print(f'{self.quality} quality {self.material} {self.Type} {self.name}'.center(150)) def display(self): print(f"{self.material} {self.name}") class Armour: def __init__(self, quality, material, armour, name): self.quality = quality self.armour = armour self.name = name self.material = material self.identify = 'armour' def displayinvent(self): print(f'{self.quality} quality {self.material} {self.name} with defense of {self.armour}'.center(150)) def display(self): print(f"{self.material} {self.name}")
当前实例打印输出
<skill.Weapon object at 0x7f89696d6640>(1) <skill.Weapon object at 0x7f89696d6220>(2) <skill.Weapon object at 0x7f89696d65b0>(3) <skill.Weapon object at 0x7f89695e6b20>(4) <skill.Armour object at 0x7f89695e66a0>(5) <skill.Armour object at 0x7f89695e6c40>(6) <skill.Armour object at 0x7f89695e6ca0>(7) <skill.Armour object at 0x7f89695e6d00>(8)
问题
已知__str__和__repr__方法,但不清楚具体用法,想优化这两个类,让打印实例时输出更具可读性,同时想了解是否有其他优化方式。
解决方案
1. 明确__str__和__repr__的定位
__repr__:面向开发者,输出需明确、无歧义,最好能通过输出还原实例结构(类名+关键参数),默认打印实例时调用的就是这个方法。__str__:面向普通用户,输出需简洁、直观,使用print()或str()转换时会优先调用。
2. 给类添加格式化方法
修改后的代码如下(注意补全了Weapon类中遗漏的dmg属性赋值):
class Weapon: def __init__(self, Type, quality, material, dmg, name): self.Type = Type self.quality = quality self.name = name self.material = material self.identify = 'Melee weapon' self.dmg = dmg # 补全初始化时的属性赋值 def displayinvent(self): print(f'{self.quality} quality {self.material} {self.Type} {self.name}'.center(150)) def display(self): print(f"{self.material} {self.name}") def __repr__(self): # 开发者视角:清晰展示实例所有关键参数 return f"Weapon(Type='{self.Type}', quality='{self.quality}', material='{self.material}', dmg={self.dmg}, name='{self.name}')" def __str__(self): # 用户视角:简洁展示核心信息 return f"{self.quality} {self.material} {self.Type} '{self.name}' (伤害: {self.dmg})" class Armour: def __init__(self, quality, material, armour, name): self.quality = quality self.armour = armour self.name = name self.material = material self.identify = 'armour' def displayinvent(self): print(f'{self.quality} quality {self.material} {self.name} with defense of {self.armour}'.center(150)) def display(self): print(f"{self.material} {self.name}") def __repr__(self): return f"Armour(quality='{self.quality}', material='{self.material}', armour={self.armour}, name='{self.name}')" def __str__(self): return f"{self.quality} {self.material} '{self.name}' (防御: {self.armour})"
测试打印示例:
sword = Weapon(Type="Sword", quality="Fine", material="Steel", dmg=15, name="Iron Edge") plate = Armour(quality="Masterwork", material="Adamantine", armour=25, name="Heavy Plate") print(repr(sword)) # 输出__repr__内容 print(str(plate)) # 输出__str__内容 print(sword) # 默认调用__str__
输出结果:
Weapon(Type='Sword', quality='Fine', material='Steel', dmg=15, name='Iron Edge') Masterwork Adamantine 'Heavy Plate' (防御: 25) Fine Steel Sword 'Iron Edge' (伤害: 15)
3. 进阶优化:提取基类减少重复代码
两个类有大量重复属性(quality、material、name、identify)和方法(display),可以抽象一个Equipment基类,让Weapon和Armour继承它,减少冗余代码:
class Equipment: def __init__(self, quality, material, name, identify): self.quality = quality self.material = material self.name = name self.identify = identify def display(self): print(f"{self.material} {self.name}") class Weapon(Equipment): def __init__(self, Type, quality, material, dmg, name): super().__init__(quality, material, name, 'Melee weapon') self.Type = Type self.dmg = dmg def displayinvent(self): print(f'{self.quality} quality {self.material} {self.Type} {self.name}'.center(150)) def __repr__(self): return f"Weapon(Type='{self.Type}', quality='{self.quality}', material='{self.material}', dmg={self.dmg}, name='{self.name}')" def __str__(self): return f"{self.quality} {self.material} {self.Type} '{self.name}' (伤害: {self.dmg})" class Armour(Equipment): def __init__(self, quality, material, armour, name): super().__init__(quality, material, name, 'armour') self.armour = armour def displayinvent(self): print(f'{self.quality} quality {self.material} {self.name} with defense of {self.armour}'.center(150)) def __repr__(self): return f"Armour(quality='{self.quality}', material='{self.material}', armour={self.armour}, name='{self.name}')" def __str__(self): return f"{self.quality} {self.material} '{self.name}' (防御: {self.armour})"
这样的结构更清晰,后续新增装备类型(如饰品、道具)时可以直接继承基类扩展。
内容的提问来源于stack exchange,提问作者Shatow
相关产品推荐
相关产品推荐

