如何使用迭代设置 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
所以我想遍历一个字典,我想为字典中的每个键创建一个 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