首页 > 解决方案 > 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 具有相同的库存,尽管它是一个全新的对象,使用默认构造函数应该创建一个新的空白库存作为列表。有人可以指出我正确的方向吗?谢谢!请忽略我愚蠢的名字,哈哈。

标签: pythonclassobjectoop

解决方案


您遇到了可变默认参数陷阱(它也适用于函数,不仅是类的方法),以防止避免使用可变默认参数,在您的情况下更改

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

推荐阅读