你可以通过相同名称的字典键更新实例变量吗?
你可以通过相同名称的字典键更新实例变量吗?
我在思考是否有一种聪明的方法,可以通过将变量名与字典中的键进行比较来更新实例变量。起初,我有一个不太完善的想法:\n示例:1\n
class Warrior: def __init__(self, name, **bonus_attributes): self.health = 1000 self.damage = 100 self.enrage = False for key, value in bonus_attributes.items(): if key == "health": self.health += value elif key == "damage": self.damage += value elif key == "enrage": self.enrage = value else: continue olaf = Warrior("Olaf") print(olaf.__dict__) gorm = Warrior("Gorm", health = -500, damage = 100, enrage = True) print(gorm.__dict__)
\n这确实解决了我的问题,但是我需要为我传递给实例的每个关键字参数添加比较语句。然后,我的朋友告诉我,将实例变量存储在一个单独的字典中也是一个好主意,就像这样:\n示例:2\n
class Warrior: def __init__(self, name, **bonus_attributes): self.variables = { "health": 1000, "damage": 100, "enrage": False } for key, value in bonus_attributes.items(): if key in self.variables: if isinstance(value, bool): self.variables[key] = value else: self.variables[key] += value olaf = Warrior("Olaf") print(olaf.__dict__) gorm = Warrior("Gorm", health = -500, damage = 100, enrage = True) print(gorm.__dict__)
\n这样做使得比较变得容易,我认为这可能是解决我的问题的最恰当方式。然而,我仍然很好奇是否有一种方法可以保持第一个示例的独立声明的实例变量。我只需要使第二个示例中的for循环适用于这些单独的声明。\n我应该继续使用我朋友建议的第二种实现方式,还是有一种方法可以修改我的第一个示例,使其像这两个字典一样容易进行比较?
在上述代码中,通过将可编辑的参数定义为构造函数的可选参数来解决这个问题。如果不想使用这种方法,可以使用示例2中的字典方法。
问题的原因是我们希望通过字典的键来更新实例变量。在上述代码中,我们定义了一个名为Warrior的类,并在构造函数中定义了name、health、damage和enrage等参数。我们希望能够通过字典的键来更新这些参数。
为了解决这个问题,我们可以在构造函数中将这些参数定义为可选参数。这样,在创建Warrior对象时,我们可以根据需要传入相应的键值对来更新实例变量。代码中的self.health = 1000 + (health or 0)表示如果传入了health参数,则将其值加到1000上,否则默认为0。同样的逻辑也适用于self.damage和self.enrage。
通过这种方式,我们可以在创建对象时通过传入键值对的方式来更新实例变量。例如,我们创建一个名为olaf的Warrior对象,没有传入任何键值对,那么它的实例变量将会使用默认值。而如果我们创建一个名为gorm的Warrior对象,并传入health = -500, damage = 100, enrage = True的键值对,那么它的实例变量将会根据传入的值来更新。
另一种解决这个问题的方法是使用字典。在示例2中,我们可以通过将实例变量定义为字典并在构造函数中使用update方法来更新。例如,我们可以将self.stats定义为一个空字典,并在构造函数中使用self.stats.update(stats)来更新实例变量。这样,我们可以通过传入一个字典来更新实例变量。
通过以上两种方法,我们可以实现通过字典的键来更新实例变量的需求。无论是将参数定义为可选参数还是使用字典进行更新,都可以灵活地根据需要来更新实例变量。