这里有一个超类:
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,
等。我该怎么做?你知道吗
您从未创建子类
Hpot
的实例。在Python中,一切都是对象,包括类。所以当你写这行的时候不创建HPot的实例,而是为类本身创建第二个名称。你知道吗
要创建实例,需要像调用函数一样调用类。你知道吗
这行代码创建了HPot的一个实例,它包含了您提到的所有属性。你知道吗
你还有第二个问题。IHpot有一个
__str__
方法,但它不是str。join函数需要字符串列表,而不是可以转换为字符串的对象列表。您必须自己转换列表,例如使用列表理解:您的清单包含这些类,但看起来您希望它包含这些类的实例。你知道吗
而不是:
执行:
对于
openinv
,您可以将每个Item
实例转换为str
,如下所示:必须先实例化
Item
类,然后才能使用实例方法(第一个参数是self
的方法)。如果需要更多信息,请搜索“python类vs实例方法”。你知道吗相关问题 更多 >
编程相关推荐