python - Python中的类方法更新整个类而不是单个对象
问题描述
class GameCharacter(object):
def __init__(self, name, health=100,strength=10,inventory=[]):
self.name=name
self.health=health
self.strength=strength
self.inventory=inventory
def fight(self,other):
damage=random.randint(1,self.strength)
print(self.name+" hits "+other.name+", doing "+str(damage)+" damage.")
other.health-=damage
print(other.name+ " has "+str(other.health)+" health left\n")
def addToInventory(self, itemName):
self.itemName=itemName
self.inventory.append(itemName)
def checkInventory(self):
print(self.name + "'s inventory includes: " + str(self.inventory))
def __str__(self):
return self.name+"\n"+"Health: "+str(self.health)+"\n"+"Strength: "+str(self.strength)+"\n"+"Inventory: "+"\n"+str("\n".join(self.inventory))+"\n"
因此,总的来说,我对编程还很陌生,而且在我的一生中,我无法弄清楚自己做错了什么。我正在从事一项涉及模拟视频游戏角色的任务。我正在尝试添加一个“添加到库存”方法,虽然它有效,但它显然会更新整个类。因此,在 Object #1 调用该方法之后,未来的对象将保留与 Object #1 相同的清单。我只希望新对象在创建时有一个清单的空列表,这就是我在构造函数中设置它的方式。
Drew
Health: 105
Strength: 15
Inventory:
Rusty Sword
Weak Shield
Heavy Stick
<class '__main__.GameCharacter'>
<class 'list'>
Drew's inventory includes: ['Rusty Sword', 'Weak Shield', 'Heavy Stick']
Mister Pickle
Health: 100
Strength: 10
Inventory:
Rusty Sword
Weak Shield
Heavy Stick
这是输出,其中“Drew”是对象 1。“Mister Pickle”是正在打印的全新对象。名称、健康和力量属性符合预期。但是,如您所见,Mister Pickle 具有相同的库存,尽管它是一个全新的对象,使用默认构造函数应该创建一个新的空白库存作为列表。有人可以指出我正确的方向吗?谢谢!请忽略我愚蠢的名字,哈哈。
解决方案
您遇到了可变默认参数陷阱(它也适用于函数,不仅是类的方法),以防止避免使用可变默认参数,在您的情况下更改
def __init__(self, name, health=100,strength=10,inventory=[]):
self.name=name
self.health=health
self.strength=strength
self.inventory=inventory
至
def __init__(self, name, health=100,strength=10,inventory=None):
self.name=name
self.health=health
self.strength=strength
self.inventory=[] if inventory is None else inventory
推荐阅读
- c# - 输入标签助手的本地化格式(日期)
- docker - Gitlab作业失败-找不到docker命令
- javascript - 在 iframe 或模式弹出窗口中打开我的网站,而不是重定向到我的页面
- javascript - 如何使用 CAML 修复“当前用户的过滤器查找”
- python - 循环浏览 PDF 并将所有页面保存到 DataFrame
- react-native - 用于构建应用程序的推荐库,包括深度链接和 oauth
- angular - 如何将任何类型应用于可观察对象返回的对象?
- c# - 无法保存附件。操作失败。在服务器中找不到对象错误
- c# - 如何在实体框架中使用 c# 将任何类型的文本文件转换为 asp.net web api 中的 PDF 文件?
- visual-studio-code - 从滚动中停止 vscode 预览