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

如何优化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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.24 18:06:30