如何使用迭代设置 class 变量的名称?

How to set the name of a class variable using iterations?

所以我想遍历一个字典,我想为字典中的每个键创建一个 class 变量,但是 class 变量的名称不会根据循环改变

例如:

fruits= {'pears': 3, 'strawberries': 5, 'apples': 2, 'watermelons': 1, 'oranges':4}

class Fruit():
   def __init__(self, fruits):
      for fruitname in fruits:
          self.fruitname = fruits[fruitname]
          #How do I change fruitname when it is "connected" to the self

我尝试在 Whosebug 上寻找其他一些问题,但无法真正找到问题所在,因为我不知道该如何调用它。

使用setattr

fruits= {'pears': 3, 'strawberries': 5, 'apples': 2, 'watermellons': 1, 'oranges':4}

class Fruit():
   def __init__(self, fruits):
      for fruit_name, fruit in fruits.items():
          setattr(self, fruit_name, fruit)

fruit_instance = Fruit(fruits)

setattr and getattr could be used to respectively get or set attribute on an object. hasattr也可以用来求存在

如果您想将所有字典值添加为实例属性,您可以使用带有名称和值的 setattr 调用,或者只更新 __dict__.

例如。见下文

fruits = {'pears': 3, 'strawberries': 5, 'apples': 2, 'watermelons': 1, 'oranges': 4}


class Fruit():
    def __init__(self, fruits):
        self.__dict__.update(fruits)


if __name__ == '__main__':
    fruit = Fruit(fruits)
    print(fruit.pears)
    print(fruit.strawberries)
    print(fruit.apples)

打印出来

3
5
2

这就是 setattr () 的用武之地: https://www.w3schools.com/python/ref_func_setattr.asp

请注意 setattr( self, 'foo', 'bar')setattr( Fruit, 'foo', 'bar')

之间存在差异

另请注意,python argparse 命名空间已经这样做了一段时间,通常人们更喜欢字典而不是属性

没有 for-loop:你可以直接在run-time处用type创建这样的class:你需要通过class 字符串名称,父元组,带方法的字典,class 属性,...

fruits= {'pears': 3, 'strawberries': 5, 'apples': 2, 'watermelons': 1, 'oranges':4}

f = type('Fruit', (object,), fruits)

# tests:
print(f)
print(hasattr(f, 'pears'))
print(f.pears)

输出

<class '__main__.Fruit'>
True
3