【发布时间】:2020-05-18 00:01:24
【问题描述】:
我想知道是否有一种智能方法可以通过将变量名称与字典中的键进行比较来更新实例变量。一开始有这个想法,不是很精炼:
示例:1
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__)
它确实解决了我的问题,但我必须为传递给实例的每个关键字参数添加比较。然后我的朋友告诉我,将实例变量也存储在一个字典中是个好主意,如下所示:
示例:2
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__)
这使比较变得容易,我认为这很可能是解决我的问题的最合适的方法。但是,我仍然很想知道是否有办法坚持第一个示例,其中实例变量是自己声明的。我只需要为这些单独的声明制作第二个 for 循环示例。
我应该只保留我朋友建议的第二个实现,还是有办法修改我的第一个示例,使其与两个字典一样容易比较?
【问题讨论】:
-
您也可以查看
getattr和setattr。我总是犹豫要不要使用它们。也许看看这个:stackoverflow.com/questions/13982297/…
标签: python