【问题标题】:How to use a list of strings as variable names/object attributes?如何使用字符串列表作为变量名/对象属​​性?
【发布时间】:2020-01-22 03:37:30
【问题描述】:

我想做的是在创建对象时将字符串列表用作对象的属性。我已经看到另一个主题通过创建字典来讨论使用字符串列表作为变量,但这似乎将字符串保留为字符串,这对我不起作用,我不认为。这就是我想要的工作。这是一个 DnD 练习:

abilities = ['strength', 'dexterity', 'constitution', 'intelligence', 'wisdom', 'charisma']


class Character:
    def __init__(self):
        for ability in abilities:
            self.ability = roll_ability()       #this is a call to an outside function

谢谢!

【问题讨论】:

标签: python class object variables attributes


【解决方案1】:

使用setattr:

def __init__(self):
    for ability in abilities:
        setattr(self, ability, roll_ability())

【讨论】:

  • 使用全局变量,尤其是在类初始化中,这是一种不好的做法。
  • 假装abilities = self.abilities是第一行,而Character.abilities是一个类属性。
  • 或者只是假装abilities被命名为ABILITIES,表明它应该被用作一个常量。全局变量只有在它们不是常量时才是不好的做法;例如,Character 也是一个全局变量,包含对该类的引用。
【解决方案2】:

由于这是一款 D&D 游戏,您可能还需要动态访问能力分数;例如,saving_throw 方法可以使用您用来滚动saving throw 的能力的名称。在这种情况下,使用字典而不是单独的属性通常是更好的设计:

class Character:
    def __init__(self):
        self.abilities = { ability: roll_ability() for ability in abilities }

    def get_ability_score(self, ability):
        return self.abilities[ability]

    def saving_throw(self, ability, bonus=0):
        return roll_dice(20) + self.abilities[ability] + bonus

【讨论】:

  • 我不知道。我把它作为锻炼的练习,所以它必须通过他们的测试,我认为这会寻找特定的东西。我不确定字典是否有用。
【解决方案3】:

这可能是避免使用全局变量的另一种选择:

class Something:

    def __init__(self, *args):
        for ability in args:
            setattr(self, ability, roll_ability())


abilities = ['strength', 'dexterity', 'constitution', 'intelligence', 'wisdom', 'charisma']
s = Something(*abilities)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-05-14
    • 1970-01-01
    • 1970-01-01
    • 2013-12-03
    • 2016-01-16
    • 1970-01-01
    • 2020-08-28
    • 1970-01-01
    相关资源
    最近更新 更多