打印子类和正确访问其信息时出现问题

2024-10-03 23:30:46 发布

您现在位置:Python中文网/ 问答频道 /正文

这里有一个超类:

class Item:
    def __init__(self, name, desc, usable, value):
        self.name = name
        self.desc = desc
        self.usable = usable
        self.value = value

    def __str__(self):
        return "{}\n=====\n{}\nValue: {}\n".format(self.name, self.desc, self.usable, self.value)

以及这个子类(除其他外):

class HPot(Item):
    def __init__(self):
        super().__init__(desc="Heals for 5 HP.",
                         name="Health Potion",
                         usable=0,
                         value=3)

IHpot = HPot

在一个叫做Inv的列表中:

Inv = [IHpot]

当我print(Inv)的时候,很明显,这发生了:

[<class 'items.HPot'>]

所以我写了这个代码:

def openinv():
    print("Your inventory:")
    print(', '.join(Inv))
    print("----------")
    # [...]

然后就发生了:

Your inventory:
Traceback (most recent call last):
  File "C:/Users/Bernardo/PycharmProjects/EndlessDungeon/inventory.py", line 
29, in <module>
    openinv()
  File "C:/Users/Bernardo/PycharmProjects/EndlessDungeon/inventory.py", line 18, in openinv
    print(', '.join(Inv))
TypeError: sequence item 0: expected str instance, type found

Process finished with exit code 1

我原以为return "{}\n=====\n{}\nValue: {}\n".format(self.name, self.desc, self.usable, self.value)会有帮助(它在Item超类中),但我在网上尝试或搜索的任何东西都帮不了我。我想像Health Potion那样打印它,并且仍然能够访问类name, desc, usable,等。我该怎么做?你知道吗


Tags: nameselfinitvaluedefitemdescclass
2条回答

您从未创建子类Hpot实例。在Python中,一切都是对象,包括类。所以当你写这行的时候

IHpot = HPot

不创建HPot的实例,而是为类本身创建第二个名称。你知道吗

要创建实例,需要像调用函数一样调用类。你知道吗

IHpot = HPot()

这行代码创建了HPot的一个实例,它包含了您提到的所有属性。你知道吗

你还有第二个问题。IHpot有一个__str__方法,但它不是str。join函数需要字符串列表,而不是可以转换为字符串的对象列表。您必须自己转换列表,例如使用列表理解:

InvAsStrings = [str(a) for a in Inv]

您的清单包含这些类,但看起来您希望它包含这些类的实例。你知道吗

而不是:

IHPot = HPot

执行:

IHPot = HPot()

对于openinv,您可以将每个Item实例转换为str,如下所示:

def openinv():
    print("Your inventory:")
    print(', '.join([str(i) for i in Inv]))
    print("     ")

必须先实例化Item类,然后才能使用实例方法(第一个参数是self的方法)。如果需要更多信息,请搜索“python类vs实例方法”。你知道吗

相关问题 更多 >