【问题标题】:Can you update instance variables by dictionary keys of the same name? [duplicate]您可以通过同名的字典键更新实例变量吗? [复制]
【发布时间】: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 循环示例。

我应该只保留我朋友建议的第二个实现,还是有办法修改我的第一个示例,使其与两个字典一样容易比较?

【问题讨论】:

标签: python


【解决方案1】:

如果您知道要编辑的每一件事(如上所述),只需在构造函数中将它们定义为可选参数:

class Warrior:
  def __init__(self, name, health=None, damage=None, enrage=None):
    self.health = 1000 + (health or 0)
    self.damage = 100 + (damage or 0)
    self.enrage = enrage or False

olaf = Warrior("Olaf")
print(olaf.__dict__)

gorm = Warrior("Gorm", health = -500, damage = 100, enrage = True)
print(gorm.__dict__)

如果出于某种原因您不想这样做,我会推荐示例 2 中的字典方法。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-19
    • 2018-01-05
    • 2013-01-10
    • 1970-01-01
    • 2023-03-21
    • 1970-01-01
    相关资源
    最近更新 更多